需要正则表达式用单引号或双引号解析关键字='值'

Posted

技术标签:

【中文标题】需要正则表达式用单引号或双引号解析关键字=\'值\'【英文标题】: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'

【问题讨论】:

【参考方案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 的键/值对来解决。

【讨论】:

以上是关于需要正则表达式用单引号或双引号解析关键字='值'的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中用单引号或双引号提取字符串

正则表达式 - 单引号或双引号 -C#

Perl eval EXPR 用单引号或双引号括起来

正则表达式用于在不被单引号或双引号包围时使用空格分割字符串

向MySQL数据库插入单引号或双引号

正则表达式使用 postgres regexp_replace() 用单引号替换反斜杠和单引号