Regex multi word boundry (точное слово) - PullRequest
0 голосов
/ 30 января 2019

Я ищу способ сопоставления с точными словами, введенными в регулярном выражении.

К сожалению, граница не будет работать, потому что поисковый термин может содержать несколько слов.

Я придумалэто регулярное выражение (?:^|[\\s])(<word>)(?:$|[\\s!?]), и оно отлично работает, пока не будет несколько <word> с одного на другой.

Пример:

Регулярное выражение: (?:^|[\\s])(won)(?:$|[\\s!?])

Текст:

We won won won

В этом тексте оно будет соответствовать только каждому второму слову.Я понимаю, это потому, что требуется пробел, но этот пробел уже включен в предыдущее слово.

С этим связано больше трудностей.

Оно не должно совпадать с сокращениями, такими как won не должно совпадать won't.Это также относится к дефисным словам won-me.

. Чтобы сделать это простым, я сделал модульные тесты для тестирования всех случаев:

https://regex101.com/r/9Mj0UC/4/tests

Примечание:Я не могу проверить в модульных тестах, соответствует ли он каждому или каждой второй.Поэтому, пожалуйста, просто посмотрите на панель тестовых строк.

Может ли кто-нибудь предложить решение для этого безумия Regex?

Оно должно быть написано в Regex (и совместимо с JS)

Ответы [ 4 ]

0 голосов
/ 30 января 2019

А как насчет этого (без взгляда сзади):

/(?:^|(?!['-])[^]\b)won(?!\B|['-])/i
  1. Начало строки или любого символа, кроме 'или - перед границей слова.
  2. Слово.
  3. Утверждение Lookahead, отрицающее не границу слова или 'или -.(Этот не захватывает пробелы, поэтому повторяются слова.)
0 голосов
/ 30 января 2019

Вы можете использовать следующее выражение:

(\w+-)?won(?![-'])

Кроме того, вам необходимо проверить, программно ли пуста первая группа, см. демонстрацию на regex101.com .

Для двигателей, поддерживающих вид сзади (Chrome и т.п.), вы даже можете использовать

(?<!\w-)won(?![-'])

См. Также демонстрацию на regex101.com.


Первое можно сделать в JS примерно так:
let strings = ["I won't win", "won", "I won", "You won", "We won, finally", "Have we won?", "We won!", "We non-won match", "He won-me"];

let rx = /(\w+-)?won(?![-'])/
strings.forEach(function(item) {
    m = rx.exec(item);
    if ((m != null) && (typeof(m[1]) == 'undefined'))
        console.log(item);
});
0 голосов
/ 30 января 2019

Используйте положительный взгляд назад и положительный взгляд вперед для пробелов.ниже приведено регулярное выражение.

//check if there is are white spaces before and after the word

let regex = /(?<=\s)won(?=\s)/g;

console.log("We won won won't won no-won".match(regex));
0 голосов
/ 30 января 2019

Просто используйте \b, чтобы соответствовать границе слова:

console.log("We won won won no-won won-with-hyphen".match(/(?<!-)\b(won)\b(?!-)/g))

Regex101.com пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...