如果我有这样的字符串:
var str = "play the Ukulele in Lebanon. play the Guitar in Lebanon.";
我希望得到每个子串之间的字符串" play" "在"中,所以基本上是一个带有" Ukelele"的数组。和#34;吉他"。
现在我正在做:
var test = str.match("play(.*)in");
但那是在第一个" play"之间返回的字符串。最后" in"所以我得到了黎巴嫩的尤克里里琴。弹吉他"而不是2个单独的字符串。有没有人知道如何全局搜索字符串,以查找起始字符串和结束字符串之间所有出现的子字符串?
答案 0 :(得分:8)
您可以使用正则表达式
<强> play\s*(.*?)\s*in
强>
/
作为正则表达式文字语法的分隔符<强>演示:强>
var str = "play the Ukulele in Lebanon. play the Guitar in Lebanon.";
var regex = /play\s*(.*?)\s*in/g;
var matches = [];
while (m = regex.exec(str)) {
matches.push(m[1]);
}
document.body.innerHTML = '<pre>' + JSON.stringify(matches, 0, 4) + '</pre>';
&#13;
答案 1 :(得分:2)
你是如此接近正确的答案。你可能会忽略一些事情:
?
运算符String.match()
方法,因为它已被证明与整个模式匹配,并且没有像您期望的那样注意捕获组。另一种方法是使用RegExp.exec()
或String.replace()
,但使用替换需要更多工作,因此坚持使用 exec构建自己的数组
var str = "display the Ukulele in Lebanon. play the Guitar in Lebanon.";
var re = /\bplay (.+?) in\b/g;
var matches = [];
var match;
while ( match = re.exec(str) ){
matches[ matches.length ] = match[1];
}
document.getElementById('demo').innerHTML = JSON.stringify( matches );
<pre id="demo"></pre>
答案 2 :(得分:2)
/\bplay\s+(.+?)\s+in\b/ig
可能更具体,可能会对您有所帮助。
我相信以前提供的正则表达式可能存在一些问题。例如,/play\s*(.*?)\s*in/g
会在&#34; dis 播放照片 序列&#34;中找到匹配项。当然这不是你想要的。其中一个问题是没有任何说明&#34; play&#34;应该是一个独立的词。它需要在它之前的单词边界和它之后的至少一个空白实例(它不能是可选的)。同样,捕获组之后的空白区域不应是可选的。
我添加此内容时提供的另一个表达式/play (.+?) in/g
在&#34; play&#34;之前缺少单词边界标记。在&#34;之后#34;,所以它将包含&#34; dis 播放蓝色 k&#34;中的匹配。这不是你想要的。
至于你的表达方式,它也缺少单词边界和空格标记。但正如另一个提到的,它还需要通配符是懒惰的。否则,给定您的示例字符串,您的匹配将从&#34; play&#34;的第一个实例开始。并以&#34;&#34;中的第二个实例结束。
如果找到我提供的表达方式的问题,我们将不胜感激。
答案 3 :(得分:0)
贪婪匹配的受害者。
。*找到最长的匹配,
while。*?找到最短的匹配。
对于给定的示例, str 将是一个数组或3个包含以下内容的字符串:
int