Regex - как справиться с проблемой границ слов? - PullRequest
0 голосов
/ 04 декабря 2018

Скажите, у меня есть следующий список:

  • банан
  • яблоко (я)

И у меня есть эта строка:

Этот банан созрел.Что случилось с яблоком (ями) вчера?

Я хочу перебрать свой список и найти в строке совпадения всего слова.В первой итерации я мог бы объединить границы слов с элементом списка:

\bbanana\b

Это захватило бы "банановую" часть вышеуказанной строки.

На второй итерации, еслиЯ должен был сделать такое же объединение, я получил бы это:

\bapple(s)\b

Это не будет соответствовать apple(s) в моей строке, потому что закрывающая скобка не является символом слова.

Что я мог бы объединить с моими элементами списка, чтобы я мог правильно захватить banana и apple(s)?Подстроки для захвата могут находиться в любом месте строки, в том числе в самом начале или конце.

Я использую PHP.

1 Ответ

0 голосов
/ 04 декабря 2018

Вот один из подходов.Мы можем вручную смоделировать маркеры границы слова, независимо от типа символа, используя обходные пути.Для \b на слева мы можем использовать (?<=[\s.,;]|^), а для \b справа мы можем использовать (?=[\s.,;]|$).

$input = "This banana is ripe. What happened to the apple(s) yesterday?";
preg_match_all ("/(?<=[\s.,;]|^)apple\(s\)(?=[\s.,;]|$)/", $input, $array);
print_r($array[0]);

Array
(
    [0] => apple(s)
)

Регулярное выражение выглядит какочень ориентированный на текст инструмент, и поэтому маркер границы слова \b предназначен для поиска границ между словами и не словами, а не между словами и другими словами.

...