我找到了非常相似的帖子,但我不能在这里得到我的正则表达式。
我正在尝试编写一个正则表达式,它返回一个字符串,该字符串位于另外两个字符串之间。例如:我想要获取位于字符串"cow“和"milk”之间的字符串。
我的母牛总是产奶
将会返回
“总是给予”
下面是我到目前为止拼凑的表达式:
(?=cow).*(?=milk)
但是,这将返回字符串"cow always gives“。
发布于 2011-04-13 06:23:09
lookahead (该(?=
部件)不使用任何输入。它是一个零宽度断言(正如边界检查和lookbehinds一样)。
您希望在这里进行常规匹配,以使用cow
部分。要捕获中间的部分,可以使用一个捕获组(只需将要捕获的模式部分放在括号内):
cow(.*)milk
根本不需要lookaheads。
发布于 2016-11-24 17:36:58
用于在JavaScript中获取两个字符串之间的字符串的
正则表达式
在绝大多数情况下,最完整的解决方案是使用捕获组和惰点匹配模式。但是,JavaScript正则表达式中的点结构与换行符不匹配,因此,在100%的情况下,可以使用[^]
或[\s\S]
/[\d\D]
/[\w\W]
构造。
ECMAScript 2018和更新版本的兼容解决方案
在支持ECMAScript 2018的JavaScript环境中,s
修饰符允许.
匹配任何字符,包括换行符,并且正则表达式引擎支持可变长度的lookbehinds。因此,您可以使用如下所示的正则表达式
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环境都支持此方案以及下面的所有其他方案。请参阅答案底部的用法示例。
cow (.*?) milk
首先找到cow
,然后是一个空格,然后是除换行符之外的任何0+字符,尽可能少的*?
是一个惰性限定符,被捕获到组1中,然后必须跟上一个带有milk
的空格(这些字符也会被匹配和使用)。
场景2:多行输入
cow ([\s\S]*?) milk
在这里,首先匹配cow
和空格,然后匹配尽可能少的0+字符并将其捕获到组1中,然后匹配带有milk
的空格。
场景3:重叠匹配
如果你有一个像>>>15 text>>>67 text2>>>
这样的字符串,并且你需要在>>>
+number
+whitespace
和>>>
之间获得2个匹配项,你不能使用/>>>\d+\s(.*?)>>>/g
,因为这将只找到一个匹配项,因为在找到第一个匹配项时,67
之前的>>>
已经被消耗了。你可以使用来检查文本的存在,而不需要真正地“吞噬”它(即附加到匹配中):
/>>>\d+\s(.*?)(?=>>>)/g
如找到的第1组内容,请参阅生成text1
和text2
的online regex demo。
另请参阅。
性能注意事项
如果给定很长的输入,正则表达式模式中的惰性点匹配模式(.*?
)可能会减慢脚本执行速度。在许多情况下,在更大程度上有帮助。尝试从"Their\ncow\ngives\nmore\nmilk"
获取cow
和milk
之间的所有内容,我们看到我们只需要匹配所有不以milk
开头的行,因此,我们可以使用cow\n([\s\S]*?)\nmilk
代替cow\n([\s\S]*?)\nmilk
:
/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));
发布于 2011-04-13 06:47:53
下面是一个正则表达式,它将获取奶牛和牛奶之间的内容(没有前导/尾随空格):
srctext = "My cow always gives milk.";
var re = /(.*cow\s+)(.*)(\s+milk.*)/;
var newtext = srctext.replace(re, "$2");
https://stackoverflow.com/questions/5642315
复制相似问题