正则表达式挑战 - 要么......或者

时间:2015-02-07 00:21:37

标签: php regex match either

我还没能把这个想出来。

我需要通过匹配whole及其周围的下划线(在一个正则表达式语句中)来匹配所有这些字符串:

  1. whole_anything
  2. anything_whole
  3. anything_whole_anything
  4. 但它必须与此

    不匹配
    1. anythingwholeanything
    2. anything_wholeanything
    3. anythingwhole_anything
    4. 这意味着...制作一个正则表达式语句,只有在它之前,之后或两者都有下划线时匹配短语whole。如果没有下划线则不行。

      以下

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

      不是解决方案;)

      2015/02/09编辑:增加条件5.和6.澄清

3 个答案:

答案 0 :(得分:4)

您可以减少替代方案中的案例数量:

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

如果之前有下划线,则后面的下划线是可选的。但如果之前没有下划线,那么后面的下划线是必需的。

您可以使用PHP变量来解决将单词放两次的问题:

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

答案 1 :(得分:2)

您可以在之前和之后排除所有字母数字字符。很遗憾,您无法使用\w,因为_被视为单词字符

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

这将在匹配之前和之后排除字母数字,并且前面,后面或两者的下划线是可选的。如果不存在,则无法匹配,因为它可以通过字母或数字进行。您可以将其更改为包含特殊字符和批次。

答案 2 :(得分:2)

另一种选择。这样,我们会检查_之前和之后是否存在单词边界或whole,但我们会通过否定前瞻将whole单词排除在外。

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

Regex Demo here.