考虑一个包含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}$)
谢谢
答案 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}
)的原因是,量词通常不适用于它们。这就是为什么我们诉诸“蛮力”手段:^...|^..|^.|^
。
在许多语言中,都无法使用正向隐藏。在这种情况下,您可以对两个断言使用超前处理:
B(?=.{8,11}$)|B(?=.{0,3}$)
答案 2 :(得分:1)
如果quantifiers支持无限宽度或预定范围的lookbehind,例如.NET,Python PyPi regex模块或Java,则您也可以使用:
(?<=^[AB]{0,3})B|B(?=[AB]{0,3}$)
说明
(?<=^[AB]{0,3})
断言左边是字符串的开头,是A或B的0-3倍B
字面上匹配|
或B
字面上匹配(?=[AB]{0,3}$)
断言右边的内容是A或B的0-3倍,断言字符串的结尾