正则表达式,用空格分隔引号中的3个字符串

时间:2011-09-06 07:32:26

标签: javascript

好吧,我想代码说明了一切。

//I have this string.
var str = '"Watch out" "for the" "rock!"'
//this is one of the many patterns that I tried
res=str.match(/"(.*)" "(.*)" "(.*)"/g)

我想要一个像:res=["Watch out","for the","rock!"]这样的数组 我怎么能这样做?

5 个答案:

答案 0 :(得分:2)

像这样:

var str = '"Watch out" "for the" "rock!"'
res=str.match(/"(.*?)" "(.*?)" "(.*?)"/)
res.shift()

您需要删除g标记,因为使用该标记您将获得匹配列表,而不是单个匹配的组列表。此外,您应该将您的群组指定为非贪婪(量词*?),否则它们可能会匹配太多。最后,使用res.shift()从数组中删除第一个条目 - 第一个条目是整个匹配的字符串,您只需要组。

答案 1 :(得分:2)

/"[^"]*"\s?/g应该是一个更好的正则表达式,用于拆分由引号和空格分隔的任意数量的值。

答案 2 :(得分:1)

res = str.match(/^"([^"]*)" "([^"]*)" "([^"]*)"$/).slice(1)

答案 3 :(得分:1)

关于正则表达式我可以建议您使用以下网站:RegEx LIB。它包含许多正则表达式(我发送给你的链接直接用于String类别)。
此外,您可以在REG Tester测试正则表达式(也使用客户端引擎 - Javascript)。

我相信你可以找到你希望的正则表达式,每次你需要一个正则表达时你也可以参考它。

每次我在项目中需要RegEX时都会使用它。

答案 4 :(得分:1)

扩展Ktash's answer,但使用捕获组(括号)只获取引号内的文字:

/ “([^”] *)“\ S / G;

唯一的问题是match()不会返回带有全局修饰符的捕获组。因此必须在split()RegExp.exec()中使用,这会变得更加混乱:

选项1 - 使用RegExp.exec()

str = '"Watch out" "for the" "rock!"'
re = /"([^"]*)"\s?/g;
result = [];
match = re.exec(str);
while (match != null) {
     result.push(match[1]);
     match = re.exec(str);
}

re.exec(str)的每次调用都会返回捕获的组,直到它返回null时没有剩余。如果你再次打电话,它会重新开始,即:

> str = '"Watch out" "for the" "rock!"'
  ""Watch out" "for the" "rock!""
> re = /"([^"]*)"\s?/g;
  /"([^"]*)"\s?/g;
> re.exec(str)
  [""Watch out" ", "Watch out"]
> re.exec(str)
  [""for the" ", "for the"]
> re.exec(str)
  [""rock!"", "rock!"]
> re.exec(str)
  null
> re.exec(str)
  [""Watch out" ", "Watch out"]

根据此处的所有其他答案,返回的结果是包含整个匹配的数组,然后是捕获组,因此使用了match[1]

选项2 - 使用split()

str = '"Watch out" "for the" "rock!"'
re = /"([^"]*)"\s?/; //The global identifier isn't needed
result = str.split(re)
result = result.filter(function(e){if (e!==""){return true}}) //Remove blanks from array

.split()接受正则表达式,但str.split(re)的结果是:

  

[“”,“注意”,“”,“注意”,“”,“摇滚!”,“”]

因此有必要使用filter()函数删除空白条目。我认为split()方法更优雅,但我认为Internet Explorer(至少最多8个)缺少filter()函数。