以下是我的问题的示例脚本:
#!/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';
}
答案 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