【发布时间】:2012-01-04 10:37:58
【问题描述】:
我想匹配一个单引号或双引号,后跟任意数量的不是刚刚匹配的字符,然后是匹配的字符之一:
"--'__'--"
应该匹配两端的双引号。但是,我希望匹配具有所有格,因为任何已经测试过的字符都不应该包含在任何未来的匹配中:
"--'__'--
应该 不 匹配,因为开头的双引号永远不会在末尾跟随另一个。我想出了:
(?P<q>['"])(?>((?!(?P=q)).)*)(?P=q)
但这仍然与我上面的第二个字符串示例相匹配,中间的单引号。我不明白为什么原子组不能做到这一点。我也无法通过任何其他原子分组安排来实现这一点。
另外,如果在断言引号存在的同时仅匹配引号之间的字符是可能的,那就太好了。因为后向断言是固定宽度的,所以我不能使用反向引用来断言捕获的单引号或双引号组发生在负前瞻之前。
【问题讨论】:
-
您的输入是否仅由这些组成,还是还有其他内容?你的正则表达式没有锚定是有原因的吗?
-
@fge 好点。除非我最终将所有内容分解为更小的子表达式,否则这可能会成为更大表达式的一部分。我没有过多地使用正则表达式,我不太确定我将如何在这里使用锚点。开始锚会确保它不会像我的第二个字符串那样“在中间匹配”吗?如果这个表达式在输入开始时不匹配,那会如何改变?
-
好吧,行锚的开头确保了匹配确实只能出现在开头。您可以尝试在开头添加
^看看它的行为吗? -
我有这个有效的正则表达式:'^(['"])(((?!\1).)+)\1$' + 替换为
++) -
好的...所以似乎阻止它匹配
'_'内"-'_'-的唯一方法是使用起始锚点?如果是这样,我将不得不根据其他标准分割输入以在字符串的开头使用这个子集。关于原子组,如果我错了,请纠正我-根据我的研究,我认为(?>expression*)应该等同于expression*+?我认为原子组符号是首选。
标签: php regex atomic lookaround