Regex 后视模式
我的问题与lookbehinds有关,我想找到单词“this”后的所有第一个数字,我有以下数据: 188282这是数字12345和54321的示例Regex 后视模式,regex,lookbehind,Regex,Lookbehind,我的问题与lookbehinds有关,我想找到单词“this”后的所有第一个数字,我有以下数据: 188282这是数字12345和54321的示例 188282这是数字1234556的示例 这是数字1234556的一个示例 187293这是数字74893和83978的另一个例子 模式: 这是一个数字示例\d+ 输出: 188282这是数字12345和54321的示例 188282这是数字1234556的一个示例 这是数字1234556的示例 187293这是数字74893和83978的另一个例子
188282这是数字1234556的示例
这是数字1234556的一个示例
187293这是数字74893和83978的另一个例子 模式:
这是一个数字示例\d+
输出:
188282这是数字12345和54321的示例
188282这是数字1234556的一个示例
这是数字1234556的示例
187293这是数字74893和83978的另一个例子
为了匹配所有这些,我使用了一种更通用的方法,因为我知道我想要“this”后面的第一个数字
模式:
this[^\d]+\d+
输出:
188282这是数字12345和54321的示例
188282这是数字1234556的一个示例
这是数字1234556的示例
187293这是数字74893和83978的另一个例子
我现在尝试使用lookbehinds,因为我不想在结果中包含部分模式。按照我的第一种方法:
模式:
(?是的,可以在lookbehind中使用模式,但在大多数风格的正则表达式中不能使用可变长度的lookbehind。换句话说,不能使用量词(但允许使用像{n}
这样的固定量词)但是一些正则表达式风格允许您使用交替|
或有限(如java)量词{1,n}
net语言允许使用可变长度的lookbehind。lookbehind的问题是,并非所有语言都支持可变宽度的lookbehind(它们不能支持lookbehind,其中包含的字符数可能可变)
您可以使用前瞻和捕获组:
(?=this[^\d]+(\d+))
或者是重置匹配的\K
正则表达式字符(如果您的正则表达式引擎支持)
这取决于您对regex的实现。您必须确实进行一些测试
我知道有些实现不喜欢这样:
(?感谢您的替代方法。Net不支持\K(您提到过,以防它支持)但它确实支持可变宽度lookbehinds@JoaoRaposo是的!这是真的。想想为什么有些语言实现了一些东西而其他语言不支持!JavaScript也不支持!如果您的语言/正则表达式引擎不支持这两种东西(可能很少见,但谁知道呢),我会说只需使用这个[^\d]+(\d+)
只取第一个捕获组(忽略主捕获)。我是.net开发人员,所以我想我对这个问题没有意见,但我将看看区别,老实说,我没有意识到这一点。再次感谢您的建议此答案已添加到“Lookarounds”下的@aliteralmind:Cool,我会尽快改进它。(我目前编辑了几篇带有相同错误的帖子)期待着它。从5.30开始,Perl实验上允许这样做:
this[^\d]+\K\d+