需要正则表达式来解析带有单引号或双引号的keyword ='value'

时间:2009-06-07 15:39:31

标签: regex quotes preg-match

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

name="value"
name='value'

3 个答案:

答案 0 :(得分:14)

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

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

如果你想要它匹配像空白的表达式。

此= “”

将最后两个+替换为*否则这应该起作用

修改 正如评论中所提到的那样。道格用过......

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

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

答案 1 :(得分:4)

/^(\w+?)=(['"])(\w+?)\2$/

将密钥放在$1中,将值放在$3

答案 2 :(得分:1)

迟了几年,但由于这个问题在谷歌上排名很高,而且答案并不能满足我的需求,所以还有另一个expression

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

这将匹配单引号或双引号,并考虑转义引号和未引用的值。

name = bar
name = "bar"
name = 'bar'
name = "\"ba\"r\""
但是,它确实有一个限制,即如果缺少一个值,则读取下一个键/值对的键。这可以通过使用comma separated list键/值对来解决。