我想在字符串中找到位置,正则表达式停止匹配.
简单的例子:
my $x = 'abcdefghijklmnopqrstuvwxyz'; $x =~ /gho/;
这个例子给我字符’h’的位置,因为’h’匹配而’o’是第一个不匹配的字符.
我想过使用pos或$ – 但它不是写在不成功的比赛上.
另一个解决方案是迭代缩短正则表达式模式,直到它匹配,但这非常难看,并且不适用于复杂模式.
编辑:
对于语言学家来说:我很抱歉我的解释很糟糕.
澄清我的情况:如果你认为正则表达式是一个有限自动机,那么测试就会中断,因为一个字符不适合.这一点是我正在寻找的.
使用迭代paranthesis(如eugene y所述)是一个不错的主意,但它不适用于量词,我必须编辑模式.
还有其他想法吗?
解决方法
你提出的建议很难,但是
doable.
如果我可以解释我所理解的内容,那么你就想知道一场失败的比赛进入比赛的程度.为此,您需要能够解析正则表达式.
最好的正则表达式解析器可能是使用Perl本身和-re = debug命令行开关:
$perl -Mre=debug -e'"abcdefghijklmnopqr"=~/gh[ijkl]{5}/' Compiling REx "gh[ijkl]{5}" Final program: 1: EXACT <gh> (3) 3: CURLY {5,5} (16) 5: ANYOF[i-l][] (0) 16: END (0) anchored "gh" at 0 (checking anchored) minlen 7 Guessing start of match in sv for REx "gh[ijkl]{5}" against "abcdefghijklmnopqr" Found anchored substr "gh" at offset 6... Starting position does not conTradict /^/m... Guessed: match at offset 6 Matching REx "gh[ijkl]{5}" against "ghijklmnopqr" 6 <bcdef> <ghijklmnop> | 1:EXACT <gh>(3) 8 <defgh> <ijklmnopqr> | 3:CURLY {5,5}(16) ANYOF[i-l][] can match 4 times out of 5... Failed... Match Failed Freeing REx: "gh[ijkl]{5}"
你可以用你的正则表达式填充Perl命令行并解析stdout的返回.寻找`
这是一个匹配的正则表达式:
$perl -Mre=debug -e'"abcdefghijklmnopqr"=~/gh[ijkl]{3}/' Compiling REx "gh[ijkl]{3}" Final program: 1: EXACT <gh> (3) 3: CURLY {3,3} (16) 5: ANYOF[i-l][] (0) 16: END (0) anchored "gh" at 0 (checking anchored) minlen 5 Guessing start of match in sv for REx "gh[ijkl]{3}" against "abcdefghijklmnopqr" Found anchored substr "gh" at offset 6... Starting position does not conTradict /^/m... Guessed: match at offset 6 Matching REx "gh[ijkl]{3}" against "ghijklmnopqr" 6 <bcdef> <ghijklmnop> | 1:EXACT <gh>(3) 8 <defgh> <ijklmnopqr> | 3:CURLY {3,3}(16) ANYOF[i-l][] can match 3 times out of 3... 11 <ghijk> <lmnopqr> | 16: END(0) Match successful! Freeing REx: "gh[ijkl]{3}"
您需要构建一个可以从Perl re调试器处理the return的解析器.当正则表达式引擎试图匹配时,左手和右手角度括号显示到字符串的距离.
这不是一个简单的项目btw …