使用正则表达式解析"a=1,b=2,c=3,4,5,d=6,e=x,y,z"

3
如何使用正则表达式来分割(或匹配)这个字符串:
a=1,b=2,c=3,4,5,d=6,e=x,y,z

基本格式是名称=值,名称=值,其中值可以包含逗号,名称始终是字母数字。
我想得到的结果是:
a=1
b=2
c=3,4,5
d=6
e=x,y,z

我的第一反应是语法模糊,因为这些值包含逗号,但我认为应该是可行的,因为名称不包含=

这很接近,但它将尾随逗号与每个值匹配,并且不匹配最后一个z

(?<name>\w+)
\s*=\s*
(?<value>
\S
   (?:
      ,
      |
      .[^=]         
    )*
)

生成以下匹配项:
a=1,
b=2,
c=3,4,5,  
d=6,
e=x,y,

这里有没有正则表达式高手?

看起来是Python - 猜测来自 (?<name>... - Sebastian
C# 但不希望在重要时刻使用模式。 - powlette
你能在前面加上逗号吗?这样可能会使正则表达式更简单。 - Sebastian
1
这基本上是重复了这个问题中使用相同的正则表达式似乎是有效的。请参考这个RegexPlanet示例。所使用的表达式只是 ([^=]+)=([^=]+)(?:,|$)(与你的相似度不太大)。 - ig0774
3个回答

3

你可以使用具有向前查找断言的正则表达式,在遇到后面跟着一个字母=逗号时进行分割。以下是用于分割的正则表达式: -

",(?=[a-zA-Z0-9]=)");

我以为我对正则表达式非常了解,但我从未使用过"?=" - 这太完美了 - 谢谢! - powlette

0
在你的最后一场比赛中,与,|.[^=]相对应的.[^=]表示任何字符后面跟着一个不是=的字符。然而,z后面没有任何字符。相反,你应该将它变成任何字符后面不是=或字符串结尾的情况。
,
|
.(?:[^=]|$)

我已确认使用PHP的preg_match_all可以正常工作。


0
如果你的正则表达式引擎支持前瞻断言,你可以尝试这个:
(\w)=(\w(,\w(?!=))*)

注意:我使用了\w来缩短它。如果你只想匹配字母数字字符,可以用[a-zA-Z0-9]替换\w

regexpal上成功运行

编辑:被Rohit Jain揭穿了


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接