Regex Challenge — или … или

Я не смог понять это.

Мне нужно сопоставить все эти строки путем сопоставления whole и его окружение подчеркивает (в одном выражении регулярного выражения):

  1. whole_anything
  2. anything_whole
  3. anything_whole_anything

но это не должно соответствовать этому

  1. anythingwholeanything
  2. anything_wholeanything
  3. anythingwhole_anything

Это означает … сделать выражение регулярного выражения, соответствующую фразу whole только если это подчеркивание до, после или оба. Нет, если нет подчеркивания.

Следующие

preg_match("/(whole_|_whole_|_whole)/",string)

это не решение;)

2015/02/09 Редактировать: добавлены условия 5. и 6. для уточнения

-2

Решение

Еще одна альтернатива. Таким образом, мы проверяем наличие границы слова или _ как до, так и после whole, но мы исключаем слово whole сам по себе через негативный взгляд.

(?!\bwhole\b)((?:_|\b)whole(?:_|\b))

Regex Demo здесь.

2

Другие решения

Вы можете уменьшить количество случаев в альтернативах:

preg_match('/(_whole_?|whole_)/', $string);

Если есть подчеркивание перед, подчеркивание после является необязательным. Но если до этого нет подчеркивания, требуется подчеркивание после.

Вы можете использовать переменную PHP, чтобы решить проблему ввода слова дважды:

$word = preg_quote('whole');
preg_match("/(_{$word}_?|{$word}_)/", $string);
4

Вы можете исключить все буквенно-цифровые символы до и после. К сожалению, вы не можете использовать \w так как _ считается словом символа

([^a-zA-Z0-9])_?whole_?([^a-zA-Z0-9])

Это исключит алфавитно-цифровые символы «до» и «после», а подчеркивание впереди, сзади или в обоих случаях необязательно. Если ничего не существует, оно не может совпадать, потому что оно может начинаться с буквы или цифры. Вы можете изменить его, чтобы включить специальные символы и многое другое.

2
По вопросам рекламы [email protected]