Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式挑战-要么。。。或_Php_Regex_Match_Either - Fatal编程技术网

Php 正则表达式挑战-要么。。。或

Php 正则表达式挑战-要么。。。或,php,regex,match,either,Php,Regex,Match,Either,我还没弄明白这一点 我需要通过匹配整个及其周围的下划线(在一个regex语句中)来匹配所有这些字符串: 所有东西 任何东西\u全部 任何东西\u整个\u任何东西 但它不能与此匹配 anythingwholeanything anything\u wholeanything anythingwhole\u anything 这意味着。。。制作一个正则表达式语句,仅当它的前面、后面或两者都有下划线时,才匹配短语whole。如果没有下划线,则不会 以下 preg_match("/(whole_|_wh

我还没弄明白这一点

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

  • 所有东西
  • 任何东西\u全部
  • 任何东西\u整个\u任何东西
  • 但它不能与此匹配

  • anythingwholeanything
  • anything\u wholeanything
  • anythingwhole\u anything
  • 这意味着。。。制作一个正则表达式语句,仅当它的前面、后面或两者都有下划线时,才匹配短语
    whole
    。如果没有下划线,则不会

    以下

    preg_match("/(whole_|_whole_|_whole)/",string)
    
    不是解决方案;)


    2015/02/09编辑:新增条件5。六,。为了澄清,您可以减少备选方案中的案例数量:

    preg_match('/(_whole_?|whole_)/', $string);
    
    如果前面有下划线,后面的下划线是可选的。但如果前面没有下划线,则需要后面加下划线

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

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

    可以排除之前和之后的所有字母数字字符。很遗憾,您不能使用
    \w
    ,因为
    \u
    被视为单词字符

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

    这将从匹配中排除字母数字前后,前面、后面或两者的下划线是可选的。如果不存在,它就不能匹配,因为它不能由字母或数字进行。您可以将其更改为包含特殊字符和批次。

    另一种选择。通过这种方式,我们可以检查
    整个
    之前和之后是否存在单词边界或
    ,但是我们通过一个负面的前瞻性排除单词
    整个

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

    为什么这不是一个解决方案?它不起作用吗?
    /(\b|)整(\b|)/
    @JonathanKuhn,当前后没有下划线时会匹配。@Barmar是的,如果没有任何下划线,它会匹配,但这不是tets的情况之一。问题是如果没有下划线,则不会匹配。至少需要一个下划线。您可能应该使用负向前看和向后看,因此非字母数字字符不包括在匹配中。这也将处理下划线位于行首或行尾的情况。@Barmar My RegEx Foo不是很强。“向前看,后面看”不是我最强的套件…不幸的是。谢谢你的输入。。。但是如果我用它,它会匹配任何东西吗?我想不会,因为不允许使用alphanum字符,对吗?我尝试了一下,几乎可以正常工作。但并没有捕捉到“整件事”。但我真的很喜欢这里的“整体”只有一次:)感谢您的输入,但理想情况下我希望“整体”只使用一次:)而且,这种模式在案例5中会失败。a 6.,这是我为澄清而添加的。我知道,你回答的时候他们不在,所以很抱歉。我忘了提那些。我不明白为什么案例5和案例6会失败。它们的前后都有下划线。是否有一个未声明的要求,即如果前面或后面的字符不是下划线,则必须是单词边界?当我写答案时,案例5和6不存在。我只是按照您对需求的描述来做的。我用我新添加的条件测试了它,它可以工作:)。干得好,谢谢。即使我需要花一点时间来解码:D只要有一次“整”关键字:)那么你可以试试这个:
    (?!\b[a-z]+\b)((?:|\b)整(?:|\b))
    就是这样:)谢谢你:D