微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Perl – 正则表达式 – 第一个不匹配字符的位置

我想在字符串中找到位置,正则表达式停止匹配.

简单的例子:

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 …

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐