PHP的正则表达式匹配模式匹配的最后一次出现
问题描述:
我知道有一个负面的lookahead正则表达式可以匹配最后一次出现的字符串。PHP的正则表达式匹配模式匹配的最后一次出现
例子:replace last occurrences of string
我想要做这样的事情。
例子:
$string = 'hello example (a) hello example (b) (c)';
echo preg_replace('/\(.*?\)(?!.*\(.*?\))/', '', $string);
我试图做的是,以取代过去的事件,但我失败了(*)。我得到的输出是hello example。它取代了整个第一个(和最后一个),它是(a)hello example(b)(c)。
我的预期输出是你好例子(a)你好例子(b)。
任何人都可以提供一些提示吗?什么是正确的正则表达式来实现我想要的。非常感谢你。
答
你想在这里使用否定字符类而不是.*?
。
您的预见声明中的.*
将一直匹配到最后一次出现(...)
,然后连续回溯以保持连续顺序。
preg_replace('/\([^)]*\)(?!.*\([^)]*\))/', '', $string);
为了简化此任务,只需保留所有内容,直到最后一次出现为止。
preg_replace('/.*\K\(.*?\)/', '', $string);
答
特殊照顾错误是使用\(.*\)
它完全替代其子蒙山开始和(
蒙山)
结束。 .*
- 最大量化器,(.*)
- 最小量化器。
尝试使用:
$string = 'hello example (a) hello example (b) (c)'; echo preg_replace('/\((.*)\)$/', '', $string);
谢谢你,它完美的作品。你介意多解释一下吗?为什么需要使用否定字符?在这种情况下它是如何工作的?非常感谢你。 – overshadow 2015-02-06 05:06:04
@hwnd - 我试图像这样使用它'preg_replace('/(?!\ s + as \ s +。*)/ i','','(x as y)as z');'试图获得摆脱最后的“as ...”(预期的结果=''(x as y)'' - 但它不能代替任何东西。任何想法有什么不对? – user9645 2017-01-06 19:43:21