匹配两个字符串之间的字符串

Match string in between two strings

本文关键字:字符串 两个 之间      更新时间:2023-09-26

如果我有这样的字符串:

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

我想在每个子弦"play"和"in"之间获取字符串,所以基本上是一个带有"Ukelele"和"The Guitar"的数组。

现在我正在做:

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

但这是在第一个"播放"和最后一个"进入"之间返回字符串,所以我得到了"黎巴嫩的尤克里里。弹吉他"而不是 2 根单独的弦。有谁知道如何全局搜索字符串以查找开始字符串和结束字符串之间子字符串的所有出现次数?

您可以使用正则表达式

play's*(.*?)'s*in

  1. 使用 / 作为正则表达式文本语法的分隔符
  2. 使用惰性组匹配最小可能

演示:

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>';

你离正确答案很近。 您可能会忽略一些事情:

  1. 您需要匹配是非贪婪的,这可以通过使用?运算符来完成
  2. 不要使用 String.match() 方法,因为它已被证明与整个模式匹配,并且不会像预期的那样注意捕获组。 另一种方法是使用 RegExp.exec()String.replace() ,但使用 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>

/'bplay's+(.+?)'s+in'b/ig可能更具体,可能更适合您。

我相信之前提供的正则表达式可能存在一些问题。例如,/play's*(.*?)'s*in/g会在"按顺序播放照片"中找到匹配项。当然这不是你想要的。其中一个问题是,没有规定"玩"应该是一个离散的词。 它前面需要一个单词边界,之后至少需要一个空格实例(它不能是可选的)。 同样,捕获组后面的空格不应是可选的。

/play (.+?) in/g,我添加这个时提供的另一个表达式缺少"play"之前和"in"之后的边界标记一词,因此它将包含"display blue ink"中的匹配项。 这不是你想要的。

至于你的表达,它也缺少边界和空格标记这个词。 但正如另一个人提到的,它还需要通配符来偷懒。否则,给定您的示例字符串,您的匹配将从"play"的第一个实例开始,以第二个实例"in"结束。

如果发现我提供的表达式有问题,将不胜感激。

贪婪匹配的受害者。

.* 找到最长的可能匹配,

而 .*? 找到尽可能短的匹配项。

对于给定的示例,str 将是一个数组或 3 个字符串,其中包含:

    the Ukelele
    the Guitar
    Lebanon