我有一个字符串:
Price=10.00 and Count=30 and Name='a and b mix'
我想得到结果:
["Price=10.00", "Count=30", "Name='a and b mix'"]
我用任何方式得到它,但我不能。我需要将它们拆分为'和',但如果'和'在引用中则应该忽略。
我试试
("Price=10.00 and Count=30 and Name='a and b mix'" + ' and').match(/(.*?)and/g)
但是
["Price=10.00 and", " Count=30 and", " Name='a and", " b mix' and"]
有人知道怎么做吗?
答案 0 :(得分:2)
您的RegExp匹配太多。试试这个:
/(?:^|\b)[a-z]+=(?:'[^']+'|[^ ]+)/gi
它按预期工作。
您可以在此处查看它:http://regex101.com/r/pP3cG2/1
工作原理:
它将检查它是否是字符串的乞讨或者之前是否有空格。
然后,它将匹配来自组[a-z]
的至少一个字符
之后,它将与=
字符匹配
要完成,它将匹配字符'
,然后任何非'
然后匹配'
,或者它将匹配任何不是空格的内容。
为了适应使用单词and
进行拆分的信息,我做了这个:
/(?:^| and )([a-z]+=(?:'[^']+'|[^ ]+))/gi
它的工作方式是完全相同(除了\b
我有and
)。
它只有一个捕获组,以确保它必须工作。
即使没有所有这些检查((?:^| and )?
可以安全地),它仍可正常工作。我在O.P.上做了更改。
以下是更新后的链接:http://regex101.com/r/uA2eL4/1
作为旁注,它可以处理“不正确”格式的输入:
Price=10.00 Count=30 and Name='a and b mix'
匹配Price[...]
和Name[...]
Price=10.00 and Count=30 Name='a and b mix'
符合Price[...]
和Count[...]
的要求
Price=10.00 Count=30 Name='a and b mix'
(否and
s)仅匹配Price[...]
Price and Count=30 Name='a and b mix'
(“令牌”上没有值)仅匹配Count[...]
...
等等......
答案 1 :(得分:1)
如果您尝试匹配这些键值对,我建议使用以下正则表达式。
"Price=10.00 and Count=30 and Name='a and b mix'".match(/\S+=('[^']+'|\S+)/g)
// ["Price=10.00", "Count=30", "Name='a and b mix'"]
答案 2 :(得分:1)
(.+?)(?:and(?=(?:[^']*'[^']*')*[^']*$)|$)
你可以尝试一下。参见演示。
http://regex101.com/r/jI8lV7/5
正则表达式(.*?)and
1)它会捕获到and
而不检查它是否在引号之间。(?=(?:[^']*'[^']*')*[^']*$)
只有当它不在引号之外时才会检查and
。
2)在最后一个元素之后没有and
但它是字符串的结尾。所以你需要捕获到and|$
以考虑所有匹配。
答案 3 :(得分:0)
根据<space>and<space>
分割输入字符串。
> "Price=10.00 and Count=30 and Name='a and b mix'".split(/\sand\s(?=(?:[^']*'[^']*')*[^']*$)/g)
[ 'Price=10.00',
'Count=30',
'Name=\'a and b mix\'' ]
答案 4 :(得分:0)
使用此
var str = "Price=10.00 and Count=30 and Name='a and b mix'";
var res = str.replace("and ", ",");
或.split()
方法