正则表达式挑战——要么……要么
Regex Challenge - either ... or
我还没弄明白这个。
我需要通过匹配 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. 以进行说明
您可以减少备选方案中的案例数量:
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))
我还没弄明白这个。
我需要通过匹配 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. 以进行说明
您可以减少备选方案中的案例数量:
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))