在关键字(和)上拆分字符串,除非使用引号('..和..')

Split string on keyword (and) except when quoted ('... and ...')

本文关键字:关键字 拆分 字符串      更新时间:2023-09-26

我有一个字符串,比如:

Price=10.00 and Count=30 and Name='a and b mix'

我想得到结果:

["Price=10.00", "Count=30", "Name='a and b mix'"]

我想尽一切办法得到它,但我做不到。我需要使用"and"来拆分它们,但如果"and"在引号中,则应忽略它。

我尝试

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

有人知道怎么做吗?

您的RegExp匹配过多。试试这个:

/(?:^|'b)[a-z]+=(?:'[^']+'|[^ ]+)/gi

正如你所期望的那样。

你可以在这里查看它的操作:http://regex101.com/r/pP3cG2/1

工作原理:

它会检查它是否是字符串的乞求,或者你之前是否有空格
然后,它将匹配来自组[a-z]的至少1个字符
之后,它将匹配=字符
最后,它将匹配字符',然后匹配任何不是'的字符,然后匹配',或者匹配任何不是空格的字符。


为了适应使用单词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'("token"上没有值)将仅与Count[...]匹配。。。

等等…

(.+?)(?:and(?=(?:[^']*'[^']*')*[^']*$)|$)

你可以试试这个。请参阅演示。

http://regex101.com/r/jI8lV7/5

正则表达式(.*?)and 的问题

1) 它将捕获到and,而不检查它是否在引号之间。(?=(?:[^']*'[^']*')*[^']*$)只在and不在引号中时才考虑它。

2) 在最后一个元素之后不是and,而是字符串的末尾。因此,您需要捕获到and|$才能考虑所有匹配。

如果您试图匹配这些键和值对,我建议使用以下regex。

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

只需根据<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''' ]

使用此

var str = "Price=10.00 and Count=30 and Name='a and b mix'";
var res = str.replace("and ", ",");

.split()方法