我想匹配具有以下条件的字符串
A
A bcd 1应匹配并捕获1Abcd1应匹配并捕获1A bcd不应匹配,因为没有数字A BCd 1不应匹配,因为在A和数字之间有大写的CA bcd 1 EF应该匹配,因为1在EF之前我想出了
A bcd 1
1
Abcd1
A bcd
A BCd 1
C
A bcd 1 EF
EF
A(?!.*[A-Z]{2})+?.*(\d+)
但这对最后一个用例不起作用,因为负向前看超出了1这里是Playground
bwntbbo31#
请注意,(?!.*[A-Z]{2})+?与(?!.*[A-Z]{2})相同,因为只需要执行一次前瞻(+?匹配一个或多个但尽可能少的出现,量化后向查找总是错误的想法)。.*尽可能多地匹配除换行符之外的任何字符,因此它将获取直到最后一个数字的所有文本,并且(\d+)因此捕获匹配行上的最后一个数字。您可以使用
(?!.*[A-Z]{2})+?
(?!.*[A-Z]{2})
+?
.*
(\d+)
A(?:(?![A-Z]{2}).)*?(\d+)
请参见regex demo。
(?:(?![A-Z]{2}).)*?
如果需要跨多行匹配,请参阅How do I match any character across multiple lines in a regular expression?中的解决方案
li9yvcax2#
您可以使用\D排除lookahead和match中的匹配数字
\D
A(?!\D*[A-Z]{2})\D*(\d+)
参见regex101 demo。为了不跨换行符,可以使用[^\d\n]如果还希望防止A成为部分单词匹配的一部分,则可以附加单词边界\bA
[^\d\n]
\bA
\bA(?![^\d\n]*[A-Z]{2})[^\d\n]*(\d+)
参见另一个regex101 demo。
cvxl0en23#
除了捕获数字,还可以使用\K在遇到数字时重置匹配,这样数字就可以完全匹配:
\K
^A(?:(?![A-Z]{2}).).*?\K\d+
演示:https://regex101.com/r/JvrSIR/1
3条答案
按热度按时间bwntbbo31#
请注意,
(?!.*[A-Z]{2})+?
与(?!.*[A-Z]{2})
相同,因为只需要执行一次前瞻(+?
匹配一个或多个但尽可能少的出现,量化后向查找总是错误的想法)。.*
尽可能多地匹配除换行符之外的任何字符,因此它将获取直到最后一个数字的所有文本,并且(\d+)
因此捕获匹配行上的最后一个数字。您可以使用
请参见regex demo。
A
-一个A
字母(?:(?![A-Z]{2}).)*?
-除换行符以外的字符(不以两个大写字母的字符序列开头)出现零次或多次(但尽可能少)(\d+)
-第1组:一个或多个数字。如果需要跨多行匹配,请参阅How do I match any character across multiple lines in a regular expression?中的解决方案
li9yvcax2#
您可以使用
\D
排除lookahead和match中的匹配数字参见regex101 demo。
为了不跨换行符,可以使用
[^\d\n]
如果还希望防止
A
成为部分单词匹配的一部分,则可以附加单词边界\bA
参见另一个regex101 demo。
cvxl0en23#
除了捕获数字,还可以使用
\K
在遇到数字时重置匹配,这样数字就可以完全匹配:演示:https://regex101.com/r/JvrSIR/1