正则表达式不包括搜索词组?

时间:2019-06-14 15:04:34

标签: php regex regex-negation

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

有效。但是如何从结果中排除搜索短语?我只想剩下这个词...

2 个答案:

答案 0 :(得分:1)

您也可以通过匹配最后一次测试来使您的匹配没有前瞻性,然后忘记使用\K匹配的内容。您还可以使用\h匹配以下水平空白字符。

^.*\btest\b\h*\K.*$

Regex demo

如果您想在test第一次出现后得到其余的信息,可以将点设为非贪婪.*?

另一种选择是在\btest\b上拆分以获取所有零件并选择要保留的零件。

答案 1 :(得分:0)

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

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

Demo 1

对于非测试零件,我们还可以包括非捕获组:

(?=.*\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;