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