Regex принимает слова с символами - PullRequest
4 голосов
/ 13 февраля 2020

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

Пример строки может быть:

// In the first 3 strings, I need "C" letter to be checked in the string
C is language is required.     
We need a C language dev.
Looking for a dev who knows C!

// Keyword is Artificial Intelligence
We need looking for someone who knows Artificial Intelligence.

Для проверки вышеизложенного я создал регулярное выражение.

['C', 'Artificial Intelligence', 'D', 'Angular', 'JS'].forEach((item) => {
 const baseRex = /[!,.?": ]?/g;
 const finalRex = new RegExp(baseRex.source + item + baseRex.source); // /[!,.?": ]<C/D/Angular...>[!,.?": ]/

// Say checking for first iteration only. So let consider 'C'.
 console.log(finalRex.test('C is required')); // true
 console.log(finalRex.test('Looking for a dev who knows C!')); // true
 console.log(finalRex.test('We need a C language dev.')); // true
 console.log(finalRex.test('Computer needed')); // Also returns true | Which is wrong!

});

Я не хочу, чтобы слова, содержащие букву C, также получали счет.

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Регулярное выражение после объединения с baseRex:

[!,.?": ]?C[!,.?": ]?

Обратите внимание, что [!,.?": ]? может соответствовать 0 или 1 символу. В Computer оба подшаблона [!,.?": ]? соответствуют 0 символам, а C соответствует C, что приводит к совпадению всего регулярного выражения.

Предположительно, вы добавили туда ?, чтобы он работал на начало и конец строки, где нет символов для сопоставления. Однако вместо этого вы должны использовать ^ и $ для начала и конца. Ваше полное регулярное выражение должно быть:

(?:[!,.?": ]|^)C(?:[!,.?": ]|$)

Вы также можете заменить класс персонажа на \W, что означает [^0-9a-zA-Z_].

На самом деле вам не нужно делать все это! Существует полезное средство сравнения ширины 0, называемое «граница слова» \b, которое, похоже, именно то, что вам нужно. Ваше базовое регулярное выражение может быть просто:

\b

Оно соответствует только границе между \w и \W или между \W и \w.

0 голосов
/ 13 февраля 2020

для C

ввод:

C is language is required.     
We need a C language dev.
Looking for a dev who knows C!
Computer needed
invalidC should not match
  • js регулярное выражение: (?<!\w)C(?!\w)
  • результат матча:
    • Chrome:
    • Safari: не поддерживается look behind

распространяется на оба C или Artificial Intelligence

ввод:

C is language is required.     
We need a C language dev.
Looking for a dev who knows C!
Computer needed
invalidC should not match
We need looking for someone who knows Artificial Intelligence.
not matchArtificial Intelligence
  • регулярное выражение: (?<!\w)((C)|(Artificial Intelligence))(?!\w)
  • результат матча:
    • Chrome :

Примечание

Подробнее о look ahead и look behind, банка см. мое резюме:

и мой (китайский) учебник: 10 断言 · 应用 广泛 的 超强 搜索 : 正 则 表达式

и даже все регулярные выражения

: *1072* 一 73 让 你 看懂 和 和 所有 正 正 10 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...