嵌套捕获组

Nesting capture groups

我有以下字符串:

'TwoOrMoreDimensions'
'LookLikeVectors'
'RecentVersions'
'= getColSums'
'=getColSums'

我想捕获除最后两个字符串之外的所有字符串中所有出现的大写字母前面都有小写字母。

我可以使用 ([a-z]+)([A-Z]) 来捕获所有此类事件,但我不知道如何从最后两个字符串中排除匹配项。

可以使用否定先行排除最后两个字符串 ^(?!>\s|\=) - 是否可以将其与上面的表达式结合使用?

我尝试了 ^(?!>\s|\=)(([a-z]+)([A-Z])),但它没有产生任何匹配项。我不确定为什么,因为 ^(?!>\s|\=)(.+) 将匹配字符串开始后的所有字符作为一个组捕获。那为什么这个捕获组不能再分成组2([a-z]+)和组3([A-Z])呢?

Link to tester

您当前的正则表达式的问题是 ^ 将其锚定到字符串的开头,因此它只能匹配字符串开头的一系列小写字母和大写字母, none 你的字符串有那个。

一种方法是使用 \G 锚点,它会强制当前匹配项从上一个匹配项结束的地方开始。它可以与 ^(?!=) 交替使用,它将匹配任何不以 = 符号开头的字符串,然后是否定字符 class ([^a-z])跳过任何非小写字符:

(?:^(?!=)|\G)[^a-z]*(([a-z]+)([A-Z]))

这将提供与原始正则表达式相同的捕获组。

Demo on regex101

另一种解决方案(可能不是最有效但能满足任务)是(?:^=\s*\w*)|([a-z]+)([A-Z])

如果正则表达式以 = 开头,这实际上会强制正则表达式贪婪地消耗所有内容(在非捕获组中,尽管被认为是完全匹配),不为下一个捕获组留下任何内容。

Regex101 Demo Link