匹配两个字符串

时间:2016-02-26 05:42:28

标签: javascript regex string string-matching

如果我有这样的字符串:

var str = "play the Ukulele in Lebanon. play the Guitar in Lebanon.";

我希望得到每个子串之间的字符串" play" "在"中,所以基本上是一个带有" Ukelele"的数组。和#34;吉他"。

现在我正在做:

var test = str.match("play(.*)in");

但那是在第一个" play"之间返回的字符串。最后" in"所以我得到了黎巴嫩的尤克里里琴。弹吉他"而不是2个单独的字符串。有没有人知道如何全局搜索字符串,以查找起始字符串和结束字符串之间所有出现的子字符串?

4 个答案:

答案 0 :(得分:8)

您可以使用正则表达式

<强> play\s*(.*?)\s*in

  1. 使用/作为正则表达式文字语法的分隔符
  2. 使用惰性组匹配尽可能少的
  3. <强>演示:

    &#13;
    &#13;
    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;
    &#13;
    &#13;

答案 1 :(得分:2)

你是如此接近正确的答案。你可能会忽略一些事情:

  1. 您需要将您的匹配视为非贪婪,这可以通过?运算符
  2. 来实现
  3. 不要使用String.match()方法,因为它已被证明与整个模式匹配,并且没有像您期望的那样注意捕获组。另一种方法是使用RegExp.exec()String.replace(),但使用替换需要更多工作,因此坚持使用 exec构建自己的数组
  4. 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