我还没能把这个想出来。
我需要通过匹配whole
及其周围的下划线(在一个正则表达式语句中)来匹配所有这些字符串:
whole_anything
anything_whole
anything_whole_anything
但它必须与此
不匹配anythingwholeanything
anything_wholeanything
anythingwhole_anything
这意味着...制作一个正则表达式语句,只有在它之前,之后或两者都有下划线时匹配短语whole
。如果没有下划线则不行。
以下
preg_match("/(whole_|_whole_|_whole)/",string)
不是解决方案;)
2015/02/09编辑:增加条件5.和6.澄清
答案 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))