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)
这是因为正则表达式引擎在匹配的字符中回溯[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:]].