【问题标题】:Need regex to parse keyword='value' with single or double quotes需要正则表达式用单引号或双引号解析关键字='值'
【发布时间】:2010-11-01 00:27:00
【问题描述】:

我在编写一个正则表达式(适用于 PHP 的 preg_match())时遇到问题,该表达式将解析关键字='value' 对,无论 字符串是用单引号还是双引号括起来。 IOW 在以下两种情况下,我都需要获取 ,其中 字符串可能包含非封闭类型的引号:

name="value"
name='value'

【问题讨论】:

    标签: regex quotes preg-match


    【解决方案1】:

    在 Perl 中,这是一个可以工作的正则表达式。它首先匹配行首,然后匹配一个或多个非 = 字符并将它们设置为 $1。接下来,它查找 = 然后查找非括号,并选择匹配 " 或 ' 并将其设置为 $2。

    /^([^=]+)=(?:"([^"]+)"|'([^']+)')$/
    

    如果您希望它匹配空白表达式,例如。

    这=""

    用 * 替换最后两个 + 否则应该可以工作

    编辑 如 cmets 中所述。道格用过……

     /^\s?([^=]+)\s?=\s?("([^"]+)"|\'([^\']+)\')\s?/
    

    这将匹配输入或值以太网端的一个可选空格,并且他已删除行尾标记。

    【讨论】:

    • 它将匹配 name='asd" 与 and 处的双引号,这是不正确的。
    • 不再匹配不匹配的报价集。
    • 这不太对。 /^([^=]+)=(?:"([^"]+)"|'([^']+)')"$/ 我相信行尾元字符之前的双引号应该不在那里。
    • @Doug - 很荣幸得到 IT Conversations 的出版商的纠正 :)。谢谢更正。
    • 这是我使用的最终版本。它对单引号进行了转义,对空格更宽容。谢谢您的帮助! /^\s?([^=]+)\s?=\s?("([^"]+)"|\'([^\']+)\')\s?/
    【解决方案2】:
    /^(\w+?)=(['"])(\w+?)\2$/
    

    这会将键放在$1 中,将值放在$3 中。

    【讨论】:

      【解决方案3】:

      晚了几年,但由于这个问题在 google 上排名很高,而且答案不能满足我的需求,这里是另一个 expression

      (?<key>\w+)\s*=\s*(['"]?)(?<val>(?:(?!\2)[^\\]|\\.|\w)+)\2
      

      这将匹配单引号或双引号,同时考虑转义引号和未加引号的值。

      name = bar
      name = "bar"
      name = 'bar'
      name = "\"ba\"r\""
      

      但是,它确实有一个限制,如果一个值丢失,则读取下一个键/值对中的键。这可以通过使用 comma separated list 的键/值对来解决。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-25
        • 2019-05-11
        • 1970-01-01
        • 2012-11-24
        相关资源
        最近更新 更多