5

有没有办法在正则表达式模式中反向引用?

示例输入字符串:

Here is "some quoted" text.

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

"([^"]+)"

此正则表达式将匹配some quoted.

假设我希望它也支持单引号,我可以将表达式更改为:

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

但是,如果输入字符串混合了引号,说明Here is 'some quoted" text.我不希望正则表达式匹配怎么办。目前,第二个示例中的正则表达式仍然匹配。

我想做的是,如果第一个引号是双引号,那么结束引号必须是双引号。如果起始引号是单引号,那么结束引号必须是单引号。

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


我的另一个相关问题:使用正则表达式获取引号之间的文本

4

3 回答 3

7

您可以使用正则表达式:

(["'])[^"']+\1
  • (): 用于分组
  • [..]: 是 char 类。所以["'] 匹配"'等价于"|'
  • [^..]: 带否定的 char 类。它匹配后面未列出的任何字符^
  • +: 一个或多个的量词
  • \1: 反向引用第一组(["'])

PHP您将其用作:

preg_match('#(["\'])[^"\']+\1#',$str)
于 2010-04-27T15:27:30.297 回答
2
preg_match('/(["\'])([^"\']+)\1/', 'Here is \'quoted text" some quoted text.');

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

于 2010-04-27T15:27:26.017 回答
0

/"\(.*?\)".*?\1/ should work, but it depends on the regular expression engine

于 2010-04-27T15:25:57.530 回答