8

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

name="value"
name='value'
4

3 回答 3

14

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

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

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

这=“”

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

编辑 如评论中所述。道格用...

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

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

于 2009-06-07T15:52:57.797 回答
4
/^(\w+?)=(['"])(\w+?)\2$/

这将把键$1和值放在$3.

于 2009-06-07T17:18:51.733 回答
1

晚了几年,但由于这个问题在谷歌上排名很高,而且答案不能满足我的需求,这里有另一种表达方式

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

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

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

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

于 2014-05-15T03:55:28.300 回答