你可以在正则表达式的模式部分中使用反向引用吗?

5
有没有办法在正则表达式模式中进行反向引用?
示例输入字符串:
Here is "some quoted" text.

假设我想要提取引用的文本,我可以创建以下表达式:

"([^"]+)"

这个正则表达式可以匹配引号中的内容

如果我想让它也支持单引号,我可以将表达式更改为:

["']([^"']+)["']

但是,如果输入字符串中包含引号混合的情况,比如这里有 '一些带引号的"文本。我不希望正则表达式匹配。目前第二个示例中的正则表达式仍将匹配。

我想要做的是,如果第一个引号是双引号,则关闭引号必须是双引号。如果开始引号是单引号,则关闭引号必须是单引号。

我可以使用反向引用来实现吗?


我其他相关的问题:使用正则表达式获取引号内的文本

4个回答

8
您可以使用正则表达式:
(["'])[^"']+\1
  • () :用于分组
  • [..] :是字符类。因此,["'] 匹配 "' 相当于 "|'
  • [^..] :否定的字符类。它匹配 ^ 后面未列出的任何字符
  • + :匹配一个或多个
  • \1 :引用第一个分组,即 (["'])

PHP 中,您可以使用以下代码:

preg_match('#(["\'])[^"\']+\1#',$str)

某种方式不起作用了...反向引用仍然被支持吗? - Toskan

2
preg_match('/(["\'])([^"\']+)\1/', 'Here is \'quoted text" some quoted text.');

解释:(["'])([^"']+)\1/我将第一个引号放在括号内。因为这是第一组,它的反向引用编号是1。然后,在结束引号的位置,我放置了\1,这意味着匹配在组1中的任何字符。


0

/"\(.*?\)".*?\1/ 可能可行,但取决于正则表达式引擎。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接