【问题标题】: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/ 应该可以工作,但这取决于正则表达式引擎

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-01
        相关资源
        最近更新 更多