用于量化和查找字符的正则表达式
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}$)
说明
(?<=^[AB]{0,3})
断言左边是字符串的开始,0-3 次 A 或 B
B
字面匹配
|
或
B
字面匹配
(?=[AB]{0,3}$)
断言右边是A或B的0-3次,断言字符串结束
考虑一个包含 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}$)
说明
(?<=^[AB]{0,3})
断言左边是字符串的开始,0-3 次 A 或 BB
字面匹配|
或B
字面匹配(?=[AB]{0,3}$)
断言右边是A或B的0-3次,断言字符串结束