正则表达式按引号和加号进行分割

4

我想通过一些字符作为运算符从文本框中分割文本。我有一个分组运算符(")和一个“AND”运算符(+),就像谷歌一样。所以,这个文本:

box +box +"box" "box" "is.a.box" +"is.a.box" +"is a box"

文本框中返回的是这个:
myArray[0] = box
myArray[1] = +box
myArray[2] = +
myArray[3] = "box"
myArray[4] = "box"
myArray[5] = "is.a.box"
myArray[6] = +
myArray[7] = "is.a.box"
myArray[8] = +
myArray[9] = "is a box"

相反,我希望它返回这个:
myArray[0] = box
myArray[1] = +box
myArray[2] = +"box"
myArray[3] = "box"
myArray[4] = "is.a.box"
myArray[5] = +"is.a.box"
myArray[6] = +"is a box"

这是我正在使用的正则表达式:
/[\+\w]+|"[^"]+"/g

如何同时按照 " 和 + 符号分割字符串?


2
在边缘情况下,例如包含“+”或“"”的文本,预期的行为是什么?或者这不应该被考虑?即,“box+box”应该转换为“box”,“+box”,还是保持为“box+box”,或者其他什么? - Vala
@sp00m 因为这会将 "is a box" 分开。 - Martin Ender
@sp00m 他使用双引号将某些文本括起来,这表明他可能允许空格作为字符串的一部分,即使他的示例字符串不包含它们。 - Vala
@Thor84no 它应该允许任何未转义的字符在引号内,我举了一个带有“.”的例子,但也可以是空格、\等等... - Eugenio Cuevas
@EugenioCuevas 他的第二个问题呢?box+box(引号外)会发生什么? - Martin Ender
显示剩余4条评论
3个回答

4
看一下这个:
str.match(/\+?(?:"[^"]*"|[^\s+]+)/g)

如果可能,将以一个+开头。然后它会尝试匹配一个"。如果可以,它将尽可能多地获取非"字符和最后的"。如果没有",它将只采用尽可能多的非空格、非+字符。
这与您拥有的内容基本相同,只是我在两种可能情况前面删除了一个可选的+
还有一个补充。如果box"box"应该产生两个匹配项box"box",则使用以下代码:
str.match(/\+?(?:"[^"]*"|[^\s+"]+)/g)

3
/\+?("[^"]*"|[^\s+])+/g

这个技巧是将引用字符串视为单个字符。我们查找非空格、非特殊字符 ([^\s+]),但也会假装引用字符串("[^"]*")是一个字符。
> 'box +box +"box" "box" "is.a.box" +"is.a.box"'.match(/\+?("[^"]*"|[^\s+])+/g)
  ["box", "+box", "+"box"", ""box"", ""is.a.box"", "+"is.a.box""]

> '"string with spaces" +"extended phrase"'.match(/\+?("[^"]*"|[^\s+])+/g)
  [""string with spaces"", "+"extended phrase""]

> 'box+box'.match(/\+?("[^"]*"|[^\s+])+/g)
  ["box", "+box"]

你知道你刚刚改变了你的交替顺序,所以正则表达式不再和我的完全相同了吗? ;) - Martin Ender
@m.buettner 哈哈,哇,是啊。我只是试图跟上不断变化的要求。 :P - John Kugelman
是的,我也是,说实话 :D - Martin Ender
两种解决方案都非常好,但是@m.buettner的代码更简洁,所以我会点赞并接受他的答案。谢谢! - Eugenio Cuevas

0
你想要的结果可以通过简单地按空格拆分来实现。
你可能希望使用以下方法使其更智能化并折叠多个空格:
myArray = str.split(/[\s]+/g)

针对您的输入字符串,这将返回您想要的数组:

["box", "+box", "+"box"", ""box"", ""is.a.box"", "+"is.a.box""]

这最初是正确的,但提问者后来添加了一个示例,显示包含空格的引号括起来的术语。 - Wiseguy
啊,关于引号中的空格问题已经改变了。m.buettner的答案更好。 - owksley

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