这个判断总是评估为真正的"前瞻",不与我合作"正则表达式"perl

Isl*_*dan 1 regex perl pattern-matching

给定时,以下语句始终求值为true $Error = (uint8) 0xFE +2

if($Error =~ m/0x[0-9ABCDEFabcdef]+(?!\s*\+[0-9]+)/)
Run Code Online (Sandbox Code Playgroud)

Cas*_*yte 5

这是因为正则表达式引擎在匹配的字符中回溯[0-9ABCDEFabcdef]+成功.为避免这种情况,请使用占有量词(禁止对模式的这一特定部分进行回溯:

[0-9ABCDEFabcdef]++
Run Code Online (Sandbox Code Playgroud)

回溯简短:

当模式在字符串中的位置失败时,正则表达式引擎会逐个字符地返回以尝试其他可能性.

使用示例字符串:

 string  |  pattern                              |  state
---------+---------------------------------------+---------------
0xFE +2  |  0x[0-9ABCDEFabcdef]+(?!\s*\+[0-9]+)  | OK
0xFE +2  |  0x[0-9ABCDEFabcdef]+(?!\s*\+[0-9]+)  | OK
0xFE +2  |  0x[0-9ABCDEFabcdef]+(?!\s*\+[0-9]+)  | FAIL
0xFE +2  |  0x[0-9ABCDEFabcdef]+(?!\s*\+[0-9]+)  | BACKTRACKING
0xFE +2  |  0x[0-9ABCDEFabcdef]+(?!\s*\+[0-9]+)  | SUCCEED

作为旁注[0-9ABCDEFabcdef],您可以使用POSIX字符类代替[[:xdigit:]].