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

RegEx for quantifying and finding a character

考虑一个包含 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 个或更少字符的 B...

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

B 后面的字符不超过 3 个。

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

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

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

我们这里使用的是a positive lookahead and a positive lookbehind。这些将检查您的约束,而不是比赛的一部分。这意味着只有您感兴趣的内容(B's)才会出现在匹配中。我们不在回顾中使用量词(例如:.{0,3})的原因是因为量词通常对它们不起作用。这就是我们采用 "brute force" 方法的原因:^...|^..|^.|^.

See it live!

在许多语言中,正向回顾不可用。如果是这种情况,您可以对两个断言使用前瞻:

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

See it live!

你可以试试这个。这会在任何一组 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
      )?
      . . . . 
 )
 $

如果你只是想知道 'B' 是否匹配前 4 个或后 4 个,那就是这个

(?:^(?=.{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
           )
           . . . . 
      )
      $ 
 )

如果 quantifiers with an infinite width or a predetermined range are are supported in a lookbehind 例如 .NET,Python PyPi 正则表达式模块或 Java 你也可以使用:

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

Regex example in C#

说明

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