加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 23:22:00 所属栏目:大数据 来源:网络整理
导读:我想在字符串中找到位置,正则表达式停止匹配. 简单的例子: my $x = 'abcdefghijklmnopqrstuvwxyz';$x =~ /gho/; 这个例子给我字符’h’的位置,因为’h’匹配而’o’是第一个不匹配的字符. 我想过使用pos或$ – 但它不是写在不成功的比赛上. 另一个解决方案
我想在字符串中找到位置,正则表达式停止匹配.

简单的例子:

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 …

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读