Php 正则表达式反向引用负前瞻原子组

Php 正则表达式反向引用负前瞻原子组,php,regex,atomic,lookaround,Php,Regex,Atomic,Lookaround,我想匹配一个单引号或双引号,后面跟任意数量的字符,这些字符不是刚刚匹配的字符,后面跟一个匹配的字符: "--'__'--" 应在两端用双引号进行匹配。但是,我希望匹配具有所有格,因为已经测试过的任何字符都不应包含在任何未来的匹配中: "--'__'-- 不应匹配,因为开头的双引号后面永远不会有另一个引号。我提出了: (?P<q>['"])(?>((?!(?P=q)).)*)(?P=q) 但这仍然匹配我的第二个字符串示例,中间引用了一个引号。我不明白为什么原子团不能做到这一

我想匹配一个单引号或双引号,后面跟任意数量的字符,这些字符不是刚刚匹配的字符,后面跟一个匹配的字符:

"--'__'--"
应在两端用双引号进行匹配。但是,我希望匹配具有所有格,因为已经测试过的任何字符都不应包含在任何未来的匹配中:

"--'__'--
不应匹配,因为开头的双引号后面永远不会有另一个引号。我提出了:

(?P<q>['"])(?>((?!(?P=q)).)*)(?P=q)

但这仍然匹配我的第二个字符串示例,中间引用了一个引号。我不明白为什么原子团不能做到这一点。我也无法通过任何其他原子分组的安排来实现这一点


另外,如果在声明引号存在的同时,可以只匹配引号之间的字符,那将是非常好的。因为lookbehind断言是固定宽度的,所以我不能使用back引用断言捕获的单引号或双引号组发生在负lookbehind之前。

假设每行只有一个有效的带引号的子字符串,这可能是一个很好的起点:


您的输入仅包含这些内容,还是还有其他内容?你的正则表达式没有锚定有什么原因吗?@fge很好。这可能是更大表达式的一部分,除非我最终将所有内容分解为更小的子表达式。我没有太多地使用正则表达式,我也不太确定如何在这里使用锚点。一个开始锚确保它在中间不会像我的第二个字符串一样吗?如果这个表达式在输入开始时不匹配,那会怎样改变呢?好的,行锚点的开始确保匹配确实只能在开始时发生。你能试着在开头添加一个“^”,看看它是如何工作的吗?我有一个正则表达式:“^[”?”\1.+\1$'好的……所以,似乎防止它与-''''''''''.'中的'''.'匹配的唯一方法是使用起始锚点?如果是这样,我将不得不根据其他标准分割输入,以便在字符串的开头使用此子集。关于原子群,如果我错了,请纠正我——根据我的研究,我认为?>表达式*应该等同于表达式*+?我认为原子群表示法更可取。