gpt4 book ai didi

regex - 正则表达式中间的前瞻不匹配

转载 作者:行者123 更新时间:2023-12-02 08:18:54 25 4
gpt4 key购买 nike

我有一个字符串 $s1 = "a_b"; 我想匹配这个字符串但只捕获字母。我尝试使用前瞻:

if($s1 =~ /([a-z])(?=_)([a-z])/){print "Captured: $1, $2\n";}

但这似乎与我的字符串不匹配。我已经通过使用 (?:_) 解决了最初的问题,但我很好奇为什么我最初的尝试没有奏效?据我了解,前瞻匹配但不捕获,那么我做错了什么?

最佳答案

先行查找下一个直接位置,如果发生真断言,它会回溯到上一个匹配项 - 就在 a 之后 - 以继续匹配。仅当您在正先行 ([a-z])(?=_)_([a-z])

旁边添加一个 _ 时,您的正则表达式才会起作用

你甚至不需要(非)捕获组来代替:

if ($s1 =~ /([a-z])_([a-z])/) { print "Captured: $1, $2\n"; }

编辑

回复@Borodin 的评论

我认为向后移动与回溯相同,通过调试整个事物(Perl Debug模式)更容易识别:

Matching REx "a(?=_)_b" against "a_b"
.
.
.
0 <> <a_b> | 0| 1:EXACT <a>(3)
1 <a> <_b> | 0| 3:IFMATCH[0](9)
1 <a> <_b> | 1| 5:EXACT <_>(7)
2 <a_> <b> | 1| 7:SUCCEED(0)
| 1| subpattern success...
1 <a> <_b> | 0| 9:EXACT <_b>(11)
3 <a_b> <> | 0| 11:END(0)
Match successful!

如上所示,调试输出显示在结果的第四行(第 3 步发生时)引擎消耗字符 a_(同时处于前瞻断言中)然后我们看到在成功断言后发生回溯positive lookahead,引擎以相反的方式跳过整个子模式,并从 a 之后的位置开始。

在第 5 行,引擎只消耗了一个字符:a。 Regex101 调试器:

enter image description here

我如何解释这个回溯在这个插图中更清楚(感谢@JDB,我借用了他的 style of representation )

a(?=_)_b
*
|\
| \
| : a (match)
| * (?=_)
| |↖
| | ↖
| |↘ ↖
| | ↘ ↖
| | ↘ ↖
| | : _ (match)
| | ^ SUBPATTERN SUCCESS (OP_ASSERT :=> MATCH_MATCH)
| * _b
| |\
| | \
| | : _ (match)
| | : b (match)
| | /
| |/
| /
|/
MATCHED

我的意思是,如果先行断言成功 - 因为提取了部分输入字符串 - 它会向上返回(返回到先前的匹配偏移量 - (eptr(指向主题的指针)is not changed but offset is)在重置消耗的字符时,它会尝试从那里继续匹配,我称之为回溯。下面是引擎使用 Regexp::Debugger 采取的步骤的可视化表示

enter image description here

所以我认为这是一种回溯或一种,但是如果我所说的所有这些都是错误的,那么我将不胜感激张开双臂的任何回收。

关于regex - 正则表达式中间的前瞻不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39321511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com