【问题标题】:Can you use back references in the pattern part of a regular expression?你可以在正则表达式的模式部分使用反向引用吗?
【发布时间】:2010-04-27 15:21:32
【问题描述】:
有没有办法在正则表达式模式中进行反向引用?
输入字符串示例:
Here is "some quoted" text.
假设我要提取引用的文本,我可以创建以下表达式:
"([^"]+)"
这个正则表达式将匹配some quoted。
假设我希望它也支持单引号,我可以将表达式更改为:
["']([^"']+)["']
但是,如果输入字符串有混合引号,比如Here is 'some quoted" text.,我不希望正则表达式匹配。目前,第二个示例中的正则表达式仍然匹配。
我希望能够做的是,如果第一个引号是双引号,那么结束引号必须是双引号。如果起始引号是单引号,那么结束引号必须是单引号。
我可以使用反向引用来实现这一点吗?
我的其他相关问题:Getting text between quotes using regular expression
【问题讨论】:
标签:
php
regex
backreference
【解决方案1】:
您可以使用正则表达式:
(["'])[^"']+\1
-
() :用于分组
-
[..] :是 char 类。所以["']
匹配 " 或 ' 等效项
到"|'
-
[^..] :带有否定的字符类。
它匹配之后未列出的任何字符
^
-
+ : 一个或多个的量词
-
\1 :反向引用第一个
组是(["'])
在PHP 中,您可以这样使用:
preg_match('#(["\'])[^"\']+\1#',$str)
【解决方案2】:
preg_match('/(["\'])([^"\']+)\1/', 'Here is \'quoted text" some quoted text.');
解释:(["'])([^"']+)\1/我把第一个引号放在括号里。因为这是第一个分组,所以它的后引用编号是 1。然后,在结束引号的位置,我放置了 \1,这意味着 在第 1 组中匹配的任何字符。
【解决方案3】:
/"\(.*?\)".*?\1/ 应该可以工作,但这取决于正则表达式引擎