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 …

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...