正则expression式来获得Javascript中两个string之间的string

我发现了非常类似的post,但是我不能正确地在这里得到我的正则expression式。

我想写一个正则expression式,返回一个string之间的两个其他string。 例如:我想获取string“牛”和“牛奶”之间的string

我的牛总是给牛奶

会返回

“总是给”

这是迄今为止我拼凑在一起的expression:

(?=cow).*(?=milk) 

然而这返回string“牛总是给”

向前看( (?= part)不消耗任何input,它是一个零宽度的断言 (边界检查和向后看)。

你想在这里定期比赛,消耗cow一部分。 要捕获中间的部分,可以使用捕获组(只需将要捕获的模式部分放在括号内):

 cow(.*)milk 

根本不需要预览。

这是一个正则expression式,它将抓住牛和牛奶之间的区别(没有前导/尾随空间):

 srctext = "My cow always gives milk."; var re = /(.*cow\s+)(.*)(\s+milk.*)/; var newtext = srctext.replace(re, "$2"); 

一个例子: http : //jsfiddle.net/entropo/tkP74/

正则expression式来获得Javascript中两个string之间的string

在绝大多数情况下,最完整的解决scheme是使用具有延迟点匹配模式捕获组 。 但是,一个点. 在JS正则expression式不匹配换行符,所以,100%的情况下工作的是[^][\s\S] / [\d\D] / [\w\W]结构。

场景1:单线input

 cow (.*?) milk 

首先findcow ,然后是一个空格,然后除了换行符之外的任何0+字符,尽可能less的为*? 是一个懒惰的量词,被捕获到第1组,然后一个milk的空间必须遵循(和那些匹配和消耗 ,也)。

场景2:多行input

 cow ([\s\S]*?) milk 

在这里,首先匹配cow和空间,然后将尽可能less的任何0+字符匹配并捕获到组1中,然后与milk匹配。

场景3:重叠匹配

如果你有一个像>>>15 text>>>67 text2>>>的string,你需要在>>> + number + whitespace>>>之间得到2个匹配项,你不能使用/>>>\d+\s(.*?)>>>/g因为这只会find1匹配,因为事实上,find第一个匹配项之前, >>> 67已经被消耗 。 您可以使用积极的向前看来检查文本的存在,而不是实际上“吞噬”它(即追加匹配):

 />>>\d+\s(.*?)(?=>>>)/g 

看到在线正则expression式产生text1text2作为组1内容find。

另请参阅如何获取所有可能的重叠匹配的string

性能考虑

正则expression式模式中的惰性点匹配模式( .*? )可能会减慢脚本执行,如果input的时间很长。 在许多情况下, 展开循环技术在很大程度上有所帮助。 试图从"Their\ncow\ngives\nmore\nmilk" cow\n([\s\S]*?)\nmilk "Their\ncow\ngives\nmore\nmilk"之间抓住cowmilk之间的所有关系,我们看到我们只需要匹配所有不以milk开始的行,而不是cow\n([\s\S]*?)\nmilk我们可以使用:

 /cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm 

查看正则expression式演示 (如果可以\r\n ,使用/cow\r?\n(.*(?:\r?\n(?!milk$).*)*)\r?\nmilk/gm )。 使用这个小的testingstring,性能增益可以忽略不计,但是对于非常大的文本,您会感觉到不同(尤其是如果行很长,换行不是很多)。

JavaScript中的正则expression式示例:

 //Single/First match expected: use no global modifier and access match[1] console.log("My cow always gives milk".match(/cow (.*?) milk/)[1]); // Multiple matches: get multiple matches with a global modifier and // trim the results if length of leading/trailing delimiters is known var s = "My cow always gives milk, thier cow also gives milk"; console.log(s.match(/cow (.*?) milk/g).map(function(x) {return x.substr(4,x.length-9);})); //or use RegExp#exec inside a loop to collect all the Group 1 contents var result = [], m, rx = /cow (.*?) milk/g; while ((m=rx.exec(s)) !== null) { result.push(m[1]); } console.log(result); 
  • 你需要捕捉.*
  • 你可以(但不必)做非实质性的
  • 真的不需要向前看。

     > /cow(.*?)milk/i.exec('My cow always gives milk'); ["cow always gives milk", " always gives "] 

那么使用下面的正则expression式呢?

 (?<=My cow\s).*?(?=\smilk) 

下面我用Martinho Fernandes的解决scheme得到了我需要的东西。 代码是:

var test =“我的牛总是给牛奶”;

var testRE = test.match(“cow(。*)milk”); 警报(testRE [1]);

您会注意到我正在将testREvariables警告为一个数组。 这是因为testRE返回一个数组,出于某种原因。 输出来自:

 My cow always gives milk 

变成:

 always gives