如何在perl中匹配不在捕获缓冲区中的东西

时间:2014-03-05 10:43:25

标签: regex perl

以下是我的问题的示例脚本:

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use feature 'say';

my $string = "aaabc";

my $re = qr/
    ^           # Start of line
    (.)         # Now \1 has 'a'
    .*?         #
    ([^\1])     # This is incorrect. It does not work as I need
                # Here I need to match the thing that is not \1
                # (in this case I need to match 'b')
/x;

if ($string =~ $re) {

    say $1;
    say $2;

} else {

    say 'no match';

}

3 个答案:

答案 0 :(得分:2)

根据@DeVadder的建议,您可以使用(?>pattern),即:

  

一个“独立”子表达式,一个匹配a的子字符串   如果锚定在给定位置,则独立模式将匹配,并且   除了这个子串之外,它只匹配。

my $re = qr/
    ^           # Start of line
    (.)         # Now \1 has 'a'
    (?>\1*)     # Matches \1
    (.)
/x;

这将按预期处理两种情况

答案 1 :(得分:2)

你需要一个负面的前瞻。这将找到模式并从那里开始其余的搜索。这意味着下一次捕获将是您寻找的捕获。

my $re = qr/
    ^              # Start of line
    (.)            # Now \1 has 'a'
     .*?           #    also (.)+? works as first expression.
    (?!\1)         # Negative Lookahead is non-capturing
    (.)            # $2 is b
/x;

答案 2 :(得分:1)

正则表达式搜索捕获第一个字符并将其用作\ 1 *。最后得到一个可能与\ 1相同或不同的字符(如果存在)并检查$ 1和$ 2是否相同。如果它们相同则除了$ 1之外没有其他字符。如果我们有一个角色,那么我们有一个匹配和$ 1 ne $ 2.

#!/usr/bin/perl

use strict;
use warnings FATAL => 'all';
use feature 'say';

while(<DATA>){
    my $re = qr/^(.)\1*(.)/x;
    if ($_=~$re && $1 ne $2) {
    say $1;
    say $2;

    } else {
    say 'no match';
    }
}

__DATA__
aaaa
aaabc
abc
baacd

输出:

   no match
    a
    b
    a
    b
    b
    a