//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!"]
这样的数组
我怎么能这样做?
答案 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()
函数。