Perl给定字符串中正则表达式的所有匹配项

埃德·伯德

Perl的正则表达式匹配为左贪婪,因此正则表达式

/\A (a+) (.+) \z/x

匹配字符串'aaab',将设置$ 1 ='aaa'和$ 2 ='b'。(\ A和\ z只是强制字符串的开始和结束。)

您还可以给非贪婪的限定词,例如

/\A (a+?) (.+?) \z/x

这仍然会匹配,但是给出$ 1 ='a'和$ 2 ='aab'。

但是我想检查所有可能的方式来产生字符串,这是

$1='aaa' $2='b'
$1='aa'  $2='ab'
$1='a'   $2='aab'

第一种方式对应于默认的左贪婪行为,第三种方式对应于使第一个匹配成为非贪婪行为,但是在这两种极端之间可能存在某些方法。是否可以使用正则表达式引擎(Perl的或其他诸如PCRE或RE2的引擎)尝试所有可能的方式,以使指定的regexp生成给定的字符串?

除其他事项外,这将使您能够实现“ POSIX兼容”正则表达式匹配,其中选择了最长的总匹配项。就我而言,我真的很想看到所有可能性。

(一种方法是修改正则表达式本身,在第一次尝试时将+修饰符替换为{1,1},然后将{1,2},{1,3}等替换-对于+和*修饰符的每种组合在正则表达式中非常费力且缓慢,并且何时停止尚不明显。我希望有一些更聪明的东西。)

背景

要回答Jim G.关于这可能解决什么问题的问题,请考虑由规则给出的两种语言之间基于规则的翻译系统

translate(any string of one or more 'a' . y) = 'M' . translate(y)
translate('ab') = 'U'

然后有一个translate('aaab')的可能结果,即'MU'。您可以尝试将这些规则基于正则表达式放入Perl代码中,例如

our @m;
my @rules = (
  [ qr/\A (a+) (.*) \z/x => sub { 'M' . translate($m[1]) } ],
  [ qr/\A ab        \z/x => sub { 'U'                    } ],
);

在每个@rules规则上进行翻译,并尝试依次应用它们:

sub translate {
    my $in = shift;
    foreach (@rules) {
        my ($lhs, $rhs) = @$_;
        $in =~ $lhs or next;
        local @m = ($1, $2);
        my $r = &$rhs;
        next if index($r, 'fail') != -1;
        return $r;
    }
    return 'fail';
}

但是,调用translate('aaab')返回'fail'。这是因为它尝试应用第一个匹配(a +)(。*)的规则,而正则表达式引擎会找到具有最长可能字符串'a'的匹配项。

使用ikegami提出的答案,我们可以尝试正则表达式生成字符串的所有方式:

use re 'eval';
sub translate {
    my $in = shift;
    foreach (@rules) {
        my ($lhs, $rhs) = @$_;
        local our @matches;
        $in =~ /$lhs (?{ push @matches, [ $1, $2 ] }) (*FAIL)/x;
        foreach (@matches) {
            local @m = @$_;
            my $r = &$rhs;
            next if index($r, 'fail') != -1;
            return $r;
        }
    }
    return 'fail';
}

现在翻译('aaab')返回'MU'。

池上
local our @matches;
'aaab' =~ /^ (a+) (.+) \z (?{ push @matches, [ $1, $2 ] }) (*FAIL)/x;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式-查找字符串中的所有匹配项

来自分类Dev

Vimscript:通过字符串获取正则表达式的所有匹配项

来自分类Dev

使用正则表达式查找字符串中的所有匹配项

来自分类Dev

Python正则表达式,如何从字符串中删除所有匹配项

来自分类Dev

JavaScript正则表达式以字符串形式获取所有匹配项

来自分类Dev

使用正则表达式查找字符串中的所有匹配项

来自分类Dev

Python正则表达式,用于匹配除给定字符串以外的所有字符串

来自分类Dev

Preg匹配字符串以使用正则表达式查找->的所有匹配项

来自分类Dev

正则表达式仅将所有给定字符与重复项匹配

来自分类Dev

给定一个正则表达式,我将如何生成所有与之匹配的字符串?

来自分类Dev

使用正则表达式查找两个字符串之间的所有匹配项

来自分类Dev

用bash中的环境变量替换所有字符串正则表达式匹配项

来自分类Dev

REGEX合并正则表达式字符串,然后查找除匹配项外的所有内容

来自分类Dev

使用Javascript以任意顺序使用正则表达式查找字符串中的所有匹配项

来自分类Dev

在Groovy中使用正则表达式替换字符串中的所有匹配项

来自分类Dev

使用正则表达式查找两个字符串之间的所有匹配项

来自分类Dev

Python-正则表达式查找字符串中的所有匹配项并替换

来自分类Dev

Java 正则表达式。匹配任何前面没有给定字符串的“值”

来自分类Dev

perl 正则表达式与带有“+”字符的字符串匹配

来自分类Dev

正则表达式匹配 2 个字符之间的所有字符串

来自分类Dev

Python大熊猫计算字符串中正则表达式匹配项的数量

来自分类Dev

字符串C#中正则表达式的第n个匹配项的索引

来自分类Dev

匹配所有内容,直到可选字符串(Python正则表达式)

来自分类Dev

匹配正则表达式的所有可能的子字符串

来自分类Dev

查找与正则表达式golang匹配的所有字符串

来自分类Dev

正则表达式字符串匹配所有未包装的内容

来自分类Dev

字符串替换所有正则表达式模式,如果嵌套则不匹配

来自分类Dev

JS正则表达式匹配字符串中的所有单词

来自分类Dev

正则表达式:在所有行中查找多个匹配的字符串

Related 相关文章

  1. 1

    正则表达式-查找字符串中的所有匹配项

  2. 2

    Vimscript:通过字符串获取正则表达式的所有匹配项

  3. 3

    使用正则表达式查找字符串中的所有匹配项

  4. 4

    Python正则表达式,如何从字符串中删除所有匹配项

  5. 5

    JavaScript正则表达式以字符串形式获取所有匹配项

  6. 6

    使用正则表达式查找字符串中的所有匹配项

  7. 7

    Python正则表达式,用于匹配除给定字符串以外的所有字符串

  8. 8

    Preg匹配字符串以使用正则表达式查找->的所有匹配项

  9. 9

    正则表达式仅将所有给定字符与重复项匹配

  10. 10

    给定一个正则表达式,我将如何生成所有与之匹配的字符串?

  11. 11

    使用正则表达式查找两个字符串之间的所有匹配项

  12. 12

    用bash中的环境变量替换所有字符串正则表达式匹配项

  13. 13

    REGEX合并正则表达式字符串,然后查找除匹配项外的所有内容

  14. 14

    使用Javascript以任意顺序使用正则表达式查找字符串中的所有匹配项

  15. 15

    在Groovy中使用正则表达式替换字符串中的所有匹配项

  16. 16

    使用正则表达式查找两个字符串之间的所有匹配项

  17. 17

    Python-正则表达式查找字符串中的所有匹配项并替换

  18. 18

    Java 正则表达式。匹配任何前面没有给定字符串的“值”

  19. 19

    perl 正则表达式与带有“+”字符的字符串匹配

  20. 20

    正则表达式匹配 2 个字符之间的所有字符串

  21. 21

    Python大熊猫计算字符串中正则表达式匹配项的数量

  22. 22

    字符串C#中正则表达式的第n个匹配项的索引

  23. 23

    匹配所有内容,直到可选字符串(Python正则表达式)

  24. 24

    匹配正则表达式的所有可能的子字符串

  25. 25

    查找与正则表达式golang匹配的所有字符串

  26. 26

    正则表达式字符串匹配所有未包装的内容

  27. 27

    字符串替换所有正则表达式模式,如果嵌套则不匹配

  28. 28

    JS正则表达式匹配字符串中的所有单词

  29. 29

    正则表达式:在所有行中查找多个匹配的字符串

热门标签

归档