从正则表达式中的单词边界中排除下划线

问题描述 投票:0回答:3

我正在使用正则表达式单词边界,我试图在下面的

foo
中匹配
$sentence
,但结果不是我需要的,
underscore
正在杀了我,我希望下划线成为单词边界就像连字符或空格一样:

$sentence = "foo_foo_foo foo-foo_foo";
              X   X   X  YES  X   X

预期:

$sentence = "foo_foo_foo foo-foo_foo";
             YES YES YES YES YES YES

我的代码:

preg_match("/\bfoo\b/i", $sentence);
php regex pcre word-boundary
3个回答
12
投票

您必须创建DIY边界。

(?:\b|_\K)foo(?=\b|_)

0
投票

您可以从

_
中减去
\w
并使用明确的单词边界:

/(?<![^\W_])foo(?![^\W_])/i

请参阅此正则表达式演示。注意

\bfoo
=
(?<!\w)foo
foo(?!\w)
=
foo\b
,从
_
中减去
\w
(等于
[^\W]
)会得到
[^\W_]

在 PHP 中,您可以使用

preg_match_all
查找所有出现的情况:

preg_match_all("/(?<![^\W_])foo(?![^\W_])/i", $sentence)

要替换/删除所有出现的情况,您可以使用

preg_replace
:

preg_replace("/(?<![^\W_])foo(?![^\W_])/i", "YES", $sentence)

查看 PHP 在线演示

$sentence = "foo_foo_foo foo-foo_foo";
if (preg_match_all("/(?<![^\W_])foo(?![^\W_])/i", $sentence, $matches)) {
    print_r($matches[0]);
}
// => Array( [0] => foo [1] => foo [2] => foo [3] => foo [4] => foo [5] => foo)
echo PHP_EOL . preg_replace("/(?<![^\W_])foo(?![^\W_])/i", "YES", $sentence);
// => YES_YES_YES YES-YES_YES

-1
投票

这符合你的要求吗?:

preg_match_all("/foo/i", $sentence, $matches);
var_dump($matches);
© www.soinside.com 2019 - 2024. All rights reserved.