正则表达式排除搜索短语?

Regular expressions exclude search phrase?

我过滤一个字符串并搜索类似 /(?=test).*/s

有效。但如何从结果中排除搜索短语?我只想要这个词后的其余部分...

我的猜测是,带有单词边界的表达式可能会起作用:

(?=.*\btest\b.*).*(\btest\b).*

Demo 1

我们还可以包括 non-capturing 个组,对于 non-test 个部分:

(?=.*\btest\b.*)(?:.*)(\btest\b)(?:.*)

Demo 2

例子

$re = '/(?=.*\btest\b.*)(?:.*)(\btest\b)(?:.*)/m';
$str = 'test some other words that comes after
some other words before test some other words that comes after';
$subst = '';

$result = preg_replace($re, $subst, $str);

echo $result;

您也可以通过匹配最后一次出现的测试来在没有正面前瞻的情况下进行匹配,然后忘记使用 \K 匹配的内容。您还可以使用 \h.

匹配以下水平空白字符
^.*\btest\b\h*\K.*$

Regex demo

如果你想在 test 第一次出现后得到其余的,你可以使点不贪婪 .*?

另一种选择是在 \btest\b 上拆分以获得所有部分和 select 您想保留的部分。