首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >正则表达式在Javascript中获取两个字符串之间的字符串

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

Stack Overflow用户
提问于 2011-04-13 06:20:51
回答 13查看 512.1K关注 0票数 217

我找到了非常相似的帖子,但我不能在这里得到我的正则表达式。

我正在尝试编写一个正则表达式,它返回一个字符串,该字符串位于另外两个字符串之间。例如:我想要获取位于字符串"cow“和"milk”之间的字符串。

我的母牛总是产奶

将会返回

“总是给予”

下面是我到目前为止拼凑的表达式:

代码语言:javascript
复制
(?=cow).*(?=milk)

但是,这将返回字符串"cow always gives“。

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2011-04-13 06:23:09

lookahead (该(?=部件)不使用任何输入。它是一个零宽度断言(正如边界检查和lookbehinds一样)。

您希望在这里进行常规匹配,以使用cow部分。要捕获中间的部分,可以使用一个捕获组(只需将要捕获的模式部分放在括号内):

代码语言:javascript
复制
cow(.*)milk

根本不需要lookaheads。

票数 222
EN

Stack Overflow用户

发布于 2016-11-24 17:36:58

用于在JavaScript中获取两个字符串之间的字符串的

正则表达式

在绝大多数情况下,最完整的解决方案是使用捕获组惰点匹配模式。但是,JavaScript正则表达式中的点结构与换行符不匹配,因此,在100%的情况下,可以使用[^][\s\S]/[\d\D]/[\w\W]构造。

ECMAScript 2018和更新版本的兼容解决方案

在支持ECMAScript 2018的JavaScript环境中,s修饰符允许.匹配任何字符,包括换行符,并且正则表达式引擎支持可变长度的lookbehinds。因此,您可以使用如下所示的正则表达式

代码语言:javascript
复制
var result = s.match(/(?<=cow\s+).*?(?=\s+milk)/gs); // Returns multiple matches if any
// Or
var result = s.match(/(?<=cow\s*).*?(?=\s*milk)/gs); // Same but whitespaces are optional

在这两种情况下,都会检查当前位置是否存在cow之后具有任意1/0或更多空格的cow,然后匹配并使用尽可能少的0+字符(=添加到匹配值中),然后检查milk (在此子字符串之前包含任意1/0或更多空格)。

场景1:单行输入

所有JavaScript环境都支持此方案以及下面的所有其他方案。请参阅答案底部的用法示例。

代码语言:javascript
复制
cow (.*?) milk

首先找到cow,然后是一个空格,然后是除换行符之外的任何0+字符,尽可能少的*?是一个惰性限定符,被捕获到组1中,然后必须跟上一个带有milk的空格(这些字符也会被匹配和使用)。

场景2:多行输入

代码语言:javascript
复制
cow ([\s\S]*?) milk

在这里,首先匹配cow和空格,然后匹配尽可能少的0+字符并将其捕获到组1中,然后匹配带有milk的空格。

场景3:重叠匹配

如果你有一个像>>>15 text>>>67 text2>>>这样的字符串,并且你需要在>>>+number+whitespace>>>之间获得2个匹配项,你不能使用/>>>\d+\s(.*?)>>>/g,因为这将只找到一个匹配项,因为在找到第一个匹配项时,67之前的>>>已经被消耗了。你可以使用来检查文本的存在,而不需要真正地“吞噬”它(即附加到匹配中):

代码语言:javascript
复制
/>>>\d+\s(.*?)(?=>>>)/g

如找到的第1组内容,请参阅生成text1text2online regex demo

另请参阅。

性能注意事项

如果给定很长的输入,正则表达式模式中的惰性点匹配模式(.*?)可能会减慢脚本执行速度。在许多情况下,在更大程度上有帮助。尝试从"Their\ncow\ngives\nmore\nmilk"获取cowmilk之间的所有内容,我们看到我们只需要匹配所有不以milk开头的行,因此,我们可以使用cow\n([\s\S]*?)\nmilk代替cow\n([\s\S]*?)\nmilk

代码语言:javascript
复制
/cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm

查看regex demo (如果可以使用\r\n,请使用/cow\r?\n(.*(?:\r?\n(?!milk$).*)*)\r?\nmilk/gm)。使用这个小的测试字符串,性能增益可以忽略不计,但是对于非常大的文本,您会感觉到不同之处(特别是如果行很长,换行符不是很多)。

JavaScript: //Single/First match中的

示例正则表达式用法预期:不使用全局修饰符并访问match1 console.log("My cow always gives“.match(/cow (.*?)牛奶/)1);//多个匹配:使用全局修饰符获取多个匹配,并//在已知前导/尾部分隔符长度的情况下修剪结果var s=“我的牛总是产奶,他的牛也产奶”;console.log(/cow (.*?).map/g).map(function(X) {return x.substr(4,x.length-9);}));//或在循环内使用RegExp#exec收集所有第一组内容var result = [],m,rx = /cow (.*?)牛奶/克;while ((m=rx.exec(s)) !== null) { result.push(m1);} console.log(result);使用现代的String#matchAll方法const s=“我的牛总是挤奶,他的牛也挤奶”;const matches = s.matchAll(/cow (.*?) )牛奶/克);console.log(Array.from(matches,x => x1));

票数 105
EN

Stack Overflow用户

发布于 2011-04-13 06:47:53

下面是一个正则表达式,它将获取奶牛和牛奶之间的内容(没有前导/尾随空格):

代码语言:javascript
复制
srctext = "My cow always gives milk.";
var re = /(.*cow\s+)(.*)(\s+milk.*)/;
var newtext = srctext.replace(re, "$2");

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

票数 55
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5642315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档