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