是否有可能为此获得正则表达式?

时间:2015-11-05 15:14:30

标签: regex perl

我正在尝试匹配这样的正则表达式:

[AB]{2}(...)[AB]{2}其中....是一个长度为1到10的字符串,但必须至少包含一个X.此外,由于字符串中可能有多个此类匹配,因此必须找到所有可能的匹配项。例如,在字符串ABXBBDCXSBA中,它应该找到ABXBBBBDCXSBA

这可能吗? 谢谢, CR。

3 个答案:

答案 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
))

demo

答案 1 :(得分:1)

[我的理解是,除了作为分隔符之外,匹配中不允许AAABBABB

现在,让我们忽略匹配重叠的事实。

即便如此,这对于正则表达式来说实际上很难。我建议您最初忽略限制以获得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可以在任何地方使用,而不仅仅是在中间!