0

我一直无法弄清楚这一点。

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

  1. whole_anything
  2. anything_whole
  3. anything_whole_anything

但它不能匹配这个

  1. anythingwholeanything
  2. anything_wholeanything
  3. anythingwhole_anything

这意味着......制作一个正则表达式语句,whole只有当它之前,之后或两者都有下划线时才匹配短语。如果没有下划线,则不会。

以下

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

不是解决方案;)

2015/02/09 编辑:添加条件 5. 和 6. 以进行澄清

4

3 回答 3

4

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

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

如果前面有下划线,后面的下划线是可选的。但是如果前面没有下划线,后面的下划线是必须的。

可以使用一个 PHP 变量来解决把单词放两次的问题:

$word = preg_quote('whole');
preg_match("/(_{$word}_?|{$word}_)/", $string);
于 2015-02-07T00:33:19.177 回答
2

您可以排除之前和之后的所有字母数字字符。不幸的是你不能使用\w,因为_被认为是一个单词字符

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

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

于 2015-02-07T00:34:00.693 回答
2

另一种选择。通过这种方式,我们检查是否存在单词边界或_before 和 after ,但我们通过否定前瞻whole排除单词本身。whole

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

正则表达式演示在这里。

于 2015-02-07T00:58:17.253 回答