RegEX: синтаксический анализ текста для точного соответствия строки или той же строки с подчеркиванием в конце - PullRequest
2 голосов
/ 24 марта 2020

Я пытаюсь проанализировать текстовый файл в PHP и сгруппировать содержимое на основе совпадения строк.

Образец текста:

xxxx xxxx xx xxxx xxx foo xxx xxx xxxxx

xxxx xx foo xxx xxx xxxxx

xx xxxxx xxxx xx xxx xx бар xx xxxx

xxxxxx xx xxxxx x xxxx бар

xxx xxxxx xx xx foo_sub1 xxx xxxx

xx foo_sub2 xxxxx xxx x xxxx

xxx xx foo1_sub1 xxx xxxx

xxxxx foo1_sub2 xxxxx xxx x xxxx

private function stringContains ($string, $substring){
    if (preg_match("~\b$substring\b~", $string)) {
        return true;
    }
}

проблема в том, что если подстрока foo это не вернет меня foo_sub, любая идея, как отредактировать мое регулярное выражение для включения любых foo и foo_, но не foo1 или foo1 _?

Спасибо,

1 Ответ

1 голос
/ 24 марта 2020

Вы можете использовать

\bfoo(?:_\w+)?\b

См. Демоверсию regex

Подробности

  • \b - граница слова
  • foo - некоторое фиксированное значение
  • (?:_\w+)? - необязательная часть:
    • _ a _
    • \w+ - одна или несколько букв, цифр или _ символов
  • \b - граница слова

См. PHP demo :

$str = 'xxxx xxxx xx xxxx xxx foo xxx xxx xxxxx\nxxxx xx foo xxx xxx xxxxx\nxx xxxxx xxxx xx xxx xx bar xx xxxx\nxxxxxx xx xxxxx x xxxx bar\nxxx xxxxx xx xx foo_sub1 xxx xxxx\nxx foo_sub2 xxxxx xxx x xxxx\nxxx xx foo1_sub1 xxx xxxx\nxxxxx foo1_sub2 xxxxx xxx x xxxx';
if (preg_match_all('~\bfoo(?:_\w+)?\b~', $str, $matches)) {
    print_r($matches[0]);
}

Выход

Array
(
    [0] => foo
    [1] => foo
    [2] => foo_sub1
    [3] => foo_sub2
)
...