Regex 嵌套捕获组

Regex 嵌套捕获组,regex,regex-lookarounds,regex-negation,Regex,Regex Lookarounds,Regex Negation,我有以下字符串: 'TwoOrMoreDimensions' 'LookLikeVectors' 'RecentVersions' '= getColSums' '=getColSums' 我想捕获除最后两个字符串外的所有字符串中出现的大写字母前加小写字母的情况 我可以使用([a-z]+)([a-z])捕获所有此类事件,但我不知道如何从最后两个字符串中排除匹配项 最后两个字符串可以使用负前瞻^(?!>\s | \=)-是否可以将其与上面的表达式结合使用 我尝试了^(?)([a-z]+)([a-

我有以下字符串:

'TwoOrMoreDimensions'
'LookLikeVectors'
'RecentVersions'
'= getColSums'
'=getColSums'
我想捕获除最后两个字符串外的所有字符串中出现的大写字母前加小写字母的情况

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

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

我尝试了
^(?)([a-z]+)([a-z])
,但没有产生任何匹配项。我不知道为什么,因为
^(?!>\s|\=)(.+)
将匹配字符串开头后的所有字符作为一个组捕获。那么,为什么这个捕获组不能进一步分为第2组
([a-z]+)
和第3组
([a-z])


当前正则表达式的问题是,
^
将其锚定到字符串的开头,因此它只能匹配一系列小写字母,后跟字符串开头的大写字母,而您的任何字符串都没有

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

(?:^(?!=)|\G)[^a-z]*(([a-z]+)([A-Z]))
这将提供与原始正则表达式相同的捕获组


当前正则表达式的问题是,
^
将其锚定到字符串的开头,因此它只能匹配一系列小写字母,后跟字符串开头的大写字母,而您的任何字符串都没有

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

(?:^(?!=)|\G)[^a-z]*(([a-z]+)([A-Z]))
这将提供与原始正则表达式相同的捕获组

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

如果正则表达式以
=
开头,它本质上会迫使正则表达式贪婪地消耗所有内容(在非捕获组中,尽管被视为完全匹配),而不会为下一个捕获组留下任何内容

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

如果正则表达式以
=
开头,它本质上会迫使正则表达式贪婪地消耗所有内容(在非捕获组中,尽管被视为完全匹配),而不会为下一个捕获组留下任何内容


谢谢@Nick,但是如果我想反引用字符串开头的第一个字符呢?你能举例说明你的意思吗?我想使用结果表达式在每个大写字母前添加一个空格,但第一个开头的字母除外,第二个和第三个字符串。只需更改分组并替换为
\1\2
。再见,非常感谢!我没有想到包括
[^a-z]*
,也不熟悉
(?:)
\G
,所以这是一个陡峭的学习曲线。谢谢@Nick,但是,如果我想反引用字符串开头的第一个字符,该怎么办?你能举个例子说明你的意思吗?我想使用结果表达式在每个大写字母前添加一个空格,但第一、第二和第三个字符串开头的字母除外。只需更改分组并替换为
\1\2
。再见,非常感谢!我没有想到包含
[^a-z]*
,也不熟悉
(?:)
\G
,所以这是一个陡峭的学习曲线。谢谢@User 10482,但表达式似乎没有产生任何匹配项。您是否检查了答案中的
Regex101
链接?我可以看到捕获。我现在看到了,它抛出了一个关于表达式之前被终止的错误。谢谢@User 10482,但是该表达式似乎没有产生任何匹配项。您是否检查了答案中的
Regex101
链接?我可以看到捕获。我现在看到了,它抛出了一个关于表达式之前被终止的错误。