【问题标题】:find number of characters matched by regex in perl在perl中查找正则表达式匹配的字符数
【发布时间】:2013-12-22 06:57:13
【问题描述】:

我将字符串与正则表达式进行比较。如果字符串不匹配我想知道匹配在字符串中停止的位置

例如,如果我将字符串 (aaa) 与正则表达式 (aab) 进行比较,那么我想知道匹配停止的字符是什么。这里是第二个。

我尝试了以下代码,但我猜变量 $+[0] 仅在字符串匹配时才有效。

if($str!~/$reg/){
  print $+[0]
}

这里的变量是空的。那么有可能在 perl 中做我想要的吗?

【问题讨论】:

  • 您需要提供您正在使用的正则表达式的真实示例才能得到一个很好的答案。 (没有一个简单、普遍适用的答案。)
  • 嗨,您可能会发现这篇文章很有用[第一个不匹配字符的位置][1] [1]:stackoverflow.com/questions/7712282/…

标签: regex perl


【解决方案1】:

也许以下内容会有所帮助:

use strict;
use warnings;

my $string1 = 'aaaa';
my $string2 = 'aaba';
( $string1 ^ $string2 ) =~ /[^\x00]/;
print $+[0] if $+[0];

输出:

3

字符串异或的结果是每个匹配位置的\x00。正则表达式匹配该值的缺失,因此是不匹配的字符对。在上面的例子中,两个字符串匹配到它们的第三个字符。

希望这会有所帮助!

【讨论】:

  • 这是一个优雅的解决方案。但如果 regexp 使用诸如 ?,* 之类的运算符,它将不起作用
【解决方案2】:

我不认为负匹配可以告诉您字符串的哪一部分帮助它“成功地不匹配”而不深入到重新引擎中。一个更简单的解决方案是尝试实际匹配并显示失败的位置。

假设您想从左到右匹配(如您的示例中所示),请尝试以下操作:

until($str =~ /$reg/) {
   $fail = substr $reg,-1; 
   $reg  = substr $reg,0,-1;
}
print "$reg\t$fail\n";

当然,这可以简化,但你明白了。

【讨论】:

    猜你喜欢
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多