正则表达式用于量化和查找字符

时间:2019-05-29 16:15:32

标签: regex regex-lookarounds regex-negation regex-group regex-greedy

考虑一个包含12个字符的字符串,我想将该字符串分为三个四个字符的组,并在第1和第3组中找到一个字符。

例如:

AAAABBBBAAAA  -> B not found (they are in group 2)
ABAABBBBAAAA  -> B found in the first 4 characters (group 1)
AAAABBBBABAA  -> B found in the last 4 characteres (group 2)

我只能创建组1和3,但是我不知道如何在它们上找到'B':

(^.{0,4})|(.{0,4}$)

谢谢

3 个答案:

答案 0 :(得分:2)

您可以尝试一下。这会在4个组中找到一个“ B”。

Perl版本:
^(?:(?=.{0,3}(B))?....)(?:(?=.{0,3}(B))?....)(?:(?=.{0,3}(B))?....)$
PCRE版本:
^(?:(?:(?=.{0,3}(B)))?....)(?:(?:(?=.{0,3}(B)))?....)(?:(?:(?=.{0,3}(B)))?....)$

https://regex101.com/r/yV72s2/1

解释

 ^ 
 (?:
      (?=
           .{0,3} 
           ( B )                         # (1), B in first group of 4
      )?
      . . . . 
 )

 (?:
      (?=
           .{0,3} 
           ( B )                         # (2), B in second group of 4
      )?
      . . . . 
 )

 (?:
      (?=
           .{0,3} 
           ( B )                         # (3), B in third group of 4
      )?
      . . . . 
 )
 $

如果您只想查找前4个或后4个匹配的'B',那就是

(?:^(?=.{12}$)(?:(?=.{0,3}?(B))....)|(?<=^.{8})(?:(?=.{0,3}?(B))....)$)

https://regex101.com/r/wEdTCU/1

解释

 (?:
      ^ 
      (?= .{12} $ )
      (?:
           (?=
                .{0,3}? 
                ( B )                         # (1), B in first group of 4
           )
           . . . . 
      )
   |  
      (?<= ^ .{8} )
      (?:
           (?=
                .{0,3}? 
                ( B )                         # (2), B in third group of 4
           )
           . . . . 
      )
      $ 
 )

答案 1 :(得分:1)

基本上,您要匹配后面三个字符或少于三个字符的B ...

(?<=^...|^..|^.|^)B

B之后的字符少于3个。

B(?=.{0,3}$)

因此,这应该匹配所有满足您条件的B

(?<=^...|^..|^.|^)B|B(?=.{0,3}$)

我们在这里使用a positive lookahead and a positive lookbehind。这些将检查您的约束,而不会成为比赛的一部分。这意味着只有您感兴趣的内容(B的内容)才会出现在比赛中。我们在后面不使用量词(例如:.{0,3})的原因是,量词通常不适用于它们。这就是为什么我们诉诸“蛮力”手段:^...|^..|^.|^

See it live!

在许多语言中,都无法使用正向隐藏。在这种情况下,您可以对两个断言使用超前处理:

B(?=.{8,11}$)|B(?=.{0,3}$)

See it live!

答案 2 :(得分:1)

如果quantifiers支持无限宽度或预定范围的lookbehind,例如.NET,Python PyPi regex模块或Java,则您也可以使用:

(?<=^[AB]{0,3})B|B(?=[AB]{0,3}$)

Regex example in C#

说明

  • (?<=^[AB]{0,3})断言左边是字符串的开头,是A或B的0-3倍
  • B字面上匹配
  • |
  • B字面上匹配
  • (?=[AB]{0,3}$)断言右边的内容是A或B的0-3倍,断言字符串的结尾