正则表达式以获取Javascript中两个字符串之间的字符串在绝大多数情况下,最完整的解决方案是使用捕获组带着懒惰点匹配模式..然而,一个点.在JS regex中,不匹配换行字符,所以,在100%情况下,[^]或[\s\S]/[\d\D]/[\w\W]构造。ECMAScript 2018和新的兼容解决方案在JS环境中支持ECMAScript 2018, s修饰符允许.匹配任何字符,包括换行字符,regex引擎支持可变长度的查找。所以,您可以使用正则表达式,例如var result = s.match(/(?<=cow\s+).*?(?=\s+milk)/gs); // Returns multiple matches if any// Orvar result = s.match(/(?<=cow\s*).
*?(?=\s*milk)/gs); // Same but whitespaces are optional在这两种情况下,都会检查当前的位置。cow之后的任何1/0或更多的空白空间cow,则任何0+字符尽可能少地被匹配和消耗(=添加到匹配值),然后milk被选中(在此子字符串之前使用任何1/0或更多的空格)。场景1:单行输入所有JS环境都支持此方案和以下所有其他方案。参见答案底部的用法示例。cow (.*?) milkcow首先找到一个空格,然后找到除换行字符以外的任何0+字符,尽可能少使用*?是一个惰性量词,被捕获到组1中,然后用milk必须跟随(并且它们是匹配的,并且消耗掉)。场景2:多行输入cow ([\s\S]*?) milk这里,cow首先匹配一个空格,然后将任意0+字符尽可能少地匹配并捕获到第1组,然后使用milk是匹配的。场景3:重叠匹配如果你有一个字符串>>>15 text>>>67 text2>>>你需要两场比赛>>>+number+whitespace和>>>,你不能用/>>>\d+\s(.*?)>>>/g因为这将只找到一个匹配的事实,因为>>>以前67已经消耗掉找到第一次匹配。您可以使用正前瞻检查文本是否存在,而不实际“吞食”它(即附加到比赛中):/>>>\d+\s(.*?)(?=>>>)/g见在线regex演示屈服text1和text2作为第一组的内容。亦见如何获得字符串的所有可能的重叠匹配.业绩考虑懒惰点匹配模式(.*?)如果给出很长的输入,regex模式可能会减慢脚本的执行速度。在很多情况下,展开环技术在很大程度上是有帮助的。试图抓住两者之间的一切cow和milk从…"Their\ncow\ngives\nmore\nmilk",我们看到,我们只需要匹配所有的行,而不是从milk因此,而不是cow\n([\s\S]*?)\nmilk我们可以使用:/cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm见regex演示(如果可以的话)\r\n,使用/cow\r?\n(.*(?:\r?\n(?!milk$).*)*)\r?\nmilk/gm)。使用这个小测试字符串,性能增益是可以忽略不计的,但是对于非常大的文本,您会感觉到差异(特别是如果行长,换行不多)。JavaScript中的示例regex用法://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 knownvar 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 contentsvar result = [], m, rx = /cow (.*?) milk/g;while ((m=rx.exec(s)) !== null) { result.push(m[1]);}console.log(result);