正则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式产生text1
和text2
作为组1内容find。
另请参阅如何获取所有可能的重叠匹配的string 。
性能考虑
正则expression式模式中的惰性点匹配模式( .*?
)可能会减慢脚本执行,如果input的时间很长。 在许多情况下, 展开循环技术在很大程度上有所帮助。 试图从"Their\ncow\ngives\nmore\nmilk"
cow\n([\s\S]*?)\nmilk
"Their\ncow\ngives\nmore\nmilk"
之间抓住cow
和milk
之间的所有关系,我们看到我们只需要匹配所有不以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