正则表达式挑战——要么……要么

Regex Challenge - either ... or

我还没弄明白这个。

我需要通过匹配 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. 以进行说明

您可以减少备选方案中的案例数量:

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

如果前面有下划线,后面的下划线是可选的。但是如果前面没有下划线,后面的下划线是必须的。

你可以用一个PHP变量来解决这个词放两次的问题:

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

您可以排除前后的所有字母数字字符。不幸的是你不能使用 \w 因为 _ 被认为是一个单词字符

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

这将从匹配之前和之后排除字母数字,前面、后面或两者的下划线是可选的。如果 none 存在,则无法匹配,因为它不能以字母或数字开头。您可以更改它以包含特殊字符和地段。

另一种选择。通过这种方式,我们检查 whole 前后是否存在单词边界或 _,但我们通过否定前瞻排除了单词 whole 本身。

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

Regex Demo here.