关键字(和)上的拆分字符串除非引用('...和...')

时间:2014-11-02 04:07:02

标签: javascript regex

我有一个字符串:

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"]

有人知道怎么做吗?

5 个答案:

答案 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()方法