2014-11-02 140 views
0

像我有一个字符串:分割字符串( '......然后......')

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

你想在JavaScript中使用正则表达式。? – 2014-11-02 04:08:56

回答

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

你可以试试this.See演示。

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

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

1)是,这将捕获直到and没有检查它是否是引号之间。 (?=(?:[^']*'[^']*')*[^']*$)将该检查仅在不在引号之间时才考虑and

2)在最后一个元素没有and之后,但它是字符串的结尾。因此,您需要捕获到and|$以考虑所有匹配。

+0

很棒,用3个部分来匹配它们。第一:(。+?),mid:?:和(?=(?:[^'] *'[^'] *')* [^'] * $),最后:$ – 2014-11-02 07:09:24

+0

在'和'将是完美的。 (。+?)(?:和(?=(?:[^'] *'[^'] *')* [^'] * $)| $) – 2014-11-02 07:23:15

+0

当它不是里面的引号。你应该修复你的RegExp。 – 2014-11-02 08:31:27

2

您的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'(no and s)只会匹配Price[...]
Price and Count=30 Name='a and b mix'(在“令牌”没有值)会匹配只有Count[...] ......

等等......

+0

不错,它的工作。但是我想用'和'来关键字来分割它们,thx。我认为@vks的答案是我想要的。 – 2014-11-02 07:04:01

+0

@ZackYang请检查我的更新。 – 2014-11-02 09:03:41

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

使用本

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

.split()方法

+0

这不是我想要的。我不想泼'A和B混合'。 – 2014-11-02 07:02:40