为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式以获取Javascript中两个字符串之间的字符串

正则表达式以获取Javascript中两个字符串之间的字符串

我发现了非常类似的帖子,但我在这里找不到我的正则表达式。我正在尝试编写一个正则表达式,它返回一个字符串,该字符串位于另外两个字符串之间。例如:我想得到驻留在字符串“牛”和“牛奶”之间的字符串。我的牛总是喂牛奶会回来“总是给予”到目前为止,我拼凑起来的表达方式如下:(?=cow).*(?=milk)不过,这会返回“牛总是给”的字符串。正则表达式以获取Javascript中两个字符串之间的字符串
查看完整描述

3 回答

?
森栏

TA贡献1810条经验 获得超5个赞

正则表达式以获取Javascript中两个字符串之间的字符串

在绝大多数情况下,最完整的解决方案是使用捕获组带着懒惰点匹配模式..然而,一个点.在JS regex中,不匹配换行字符,所以,在100%情况下,[^][\s\S]/[\d\D]/[\w\W]构造。

ECMAScript 2018和新的兼容解决方案

在JS环境中支持ECMAScript 2018s修饰符允许.匹配任何字符,包括换行字符,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 (.*?) milk

cow首先找到一个空格,然后找到除换行字符以外的任何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演示屈服text1text2作为第一组的内容。

亦见如何获得字符串的所有可能的重叠匹配.

业绩考虑

懒惰点匹配模式(.*?)如果给出很长的输入,regex模式可能会减慢脚本的执行速度。在很多情况下,展开环技术在很大程度上是有帮助的。试图抓住两者之间的一切cowmilk从…"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 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);


查看完整回答
反对 回复 2019-06-09
  • 3 回答
  • 0 关注
  • 1329 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信