Сопоставьте выражение с помощью регулярного выражения - PullRequest
0 голосов
/ 07 августа 2020

У меня есть регулярное выражение, которое может выбирать совпадения, как показано здесь введите здесь описание ссылки

\b(\w)[-'\w]* (?:[-",\/\\*&'\w]* ){1,}\(\1[A-Z]{1,}\)

Но это не будет выбирать протоколы соединителей (CP), т.е. если нет пробел между длинной формой слова и скобками. Как сделать так, чтобы регулярное выражение выбирало выражения с пробелом между скобками и без него

Однако оно должно выбирать оба протокола коннекторов {пробел} (CP) и протоколов коннекторов {no пробел} (CP)

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Вы можете использовать это чистое регулярное выражение для исправления совпадения:

/\b(\w)[-'\w]*(?: (\w)(?=[^(]*\([^)]*\2)[-",\/\\*&'\w]*)*\s*\(\1[A-Z]+\)/g

Обновленная демонстрация RegEx

Подробности RegEx:

  • \b(\w)[-'\w]* Сопоставьте одно слово и захватите первую букву в группе # 1
  • (\w)(?=[^(]*\([^)]*\2): Сопоставьте символ слова и захватите в группе # 2, пока эта буква присутствует в следующей (...)
  • [-",\/\\*&'\w]*: совпадение 0 из большего количества разрешенных символов, входящих в состав одного слова
  • (?: (\w)(?=[^(]*\([^)]*\2)[-",\/\\*&'\w]*)*: совпадение 0 или таких слов, разделенных одним пробелом
  • \s* сопоставить необязательные пробелы перед (...)
  • (\1[A-Z]+\): сопоставить cp
1 голос
/ 07 августа 2020

Делайте это просто глупо (KISS).

\b(\w)[-'\w ]+\(\1[A-Z]+\)

Чтобы лучше обрабатывать такие случаи, как standard that establishes specifications cables (SC) и so for instance secure socket layer (SSL), одного RegEx недостаточно. Используйте следующий сценарий.

const text = "The Universal Serial Bus (USB) is an industry standard that establishes specifications cables (SC) and connectors protocols(CP) whoa this is a for connection found (CF) Keep it simple stupid (KISS)! so for instance secure socket layer (SSL) Couldn't match start-of-frame (SOF) , start-of-frame (SoF), Carrier-sense multiple access with collision detection (CSMA/CD), Universal Serial Bus Test and Measurement Class (USBTMC) AND how do I allow 2 level abbreviations Battery Charging (BC), communication channel (CC) Could you please help! Pain in Grief (PG) Carrier-sense multiple access with collision detection (CSMA/CD)";

const regex = new RegExp(text.match(/\([A-Z\/]+(?=\))/g).map(m =>
    m.split("").slice(1).map(i => i.replace(/\//g, "") + "\\S*").join("(?:\\s+(?:(?:and|in|with)\\s+)?|\\s*[-&]\\s*)")
        .concat("\\s*\\" + m + "\\)")
).join("|"), "gi");

let match;
while (match = regex.exec(text)) {
    console.log(`${regex.lastIndex - match[0].length}-${regex.lastIndex}: ${match[0]}`);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...