Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 后视模式_Regex_Lookbehind - Fatal编程技术网

Regex 后视模式

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的另一个例子

我的问题与lookbehinds有关,我想找到单词“this”后的所有第一个数字,我有以下数据:

188282这是数字12345和54321的示例
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+