我正在尝试匹配这样的正则表达式:
[AB]{2}(...)[AB]{2}
其中....是一个长度为1到10的字符串,但必须至少包含一个X.此外,由于字符串中可能有多个此类匹配,因此必须找到所有可能的匹配项。例如,在字符串ABXBBDCXSBA
中,它应该找到ABXBB
和BBDCXSBA
。
这可能吗? 谢谢, CR。
答案 0 :(得分:2)
您可以尝试使用此模式:
(?=([AB]{2}(?=[^ABX]*(?:[AB][^ABX]+)*[AB]?X).{1,10}?[AB]{2}))
细节:
(?=( # a capture group in a lookahead to get overlapped results
[AB]{2} # starting delimiter
# a lookahead that checks if there is an X before the ending delimiter
(?=[^ABX]*(?:[AB][^ABX]+)*[AB]?X)
.{1,10}? # less than 10 characters before the first ending delimiter
[AB]{2} # the ending delimiter
))
答案 1 :(得分:1)
[我的理解是,除了作为分隔符之外,匹配中不允许AA
,AB
,BA
和BB
。
现在,让我们忽略匹配重叠的事实。
即便如此,这对于正则表达式来说实际上很难。我建议您最初忽略限制以获得X
,然后在没有X
的情况下过滤掉结果。
my @matches = grep /X/, /
[AB]{2}
[^AB] (?: [AB](?![AB]) | [^AB] ){0,9}
[AB]{2}
/xg;
但我们仍然需要解决重叠问题。为此,我建议先行一下。
my @matches;
while (/
(
[AB]{2}
[^AB] (?: [AB](?![AB]) | [^AB] ){0,9}
)
(?=
( [AB]{2} )
)
/xg) {
my $match = $1 . $2;
push @matches, $match if $match =~ /X/;
}
或
my @matches = grep /X/, /
(?=
(
[AB]{2}
[^AB] (?: [AB](?![AB]) | [^AB] ){0,9}
[AB]{2}
)
)
/xg;
答案 2 :(得分:0)
我认为这就是你在寻找什么
(?=([AB]{2}.{1,10}[AB]{2}))(?=.+X.+)
<?>(?= expr1)(?= expr2)是一种和。它首先检查expr1,而不是它匹配它检查expr2在我们的情况下,expr2检查字符串是否包含至少一个X,expr1检查字符串是否具有正确的长度和rigth开始和结束。
编辑: 正确的正则表达式是这样的:
(?=([AB]{2}.{1,10}[AB]{2}))(?=[AB]{2}.+X.+[AB]{2})
第一个正则表达式X可以在任何地方使用,而不仅仅是在中间!