首页 > 解决方案 > 正则表达式 C# - 组匹配不迭代

问题描述

我正在尝试在出现在特定单词之后的单词中的大写字母之前添加一个空格。

前:

[XpTo("GetTheStuff", "XXX")]

后:

[XpTo("Get The Stuff", "XXX")]

这是我最好的尝试:
表达式:(\[XpTo\(")([A-Z]{1}[a-z]+)+
替换:$1 $2
结果:[XpTo(" Stuff", "XXX")]

我不明白为什么第二组([A-Z]{1}[a-z]+)不“迭代”而只返回最后一次出现。

标签: .netregex

解决方案


您可以使用支持可变长度模式的 .NET lookbehind:

(?<=\[XpTo\("(?:[A-Z]+[a-z]+)+)[A-Z]+[a-z]+

替换为空格和$&,对整个匹配值的反向引用。

查看正则表达式演示

细节

  • (?<=\[XpTo\("(?:[A-Z]+[a-z]+)+)- 一个积极的向后看,要求其模式立即匹配到当前位置的左侧:
    • \[XpTo\("- 文字[XpTo("文本
    • (?:[A-Z]+[a-z]+)+- 一个或多个序列
    • [A-Z]+[a-z]+- 一个或多个大写 ASCII 字母后跟一个或多个小写 ASCII 字母
  • [A-Z]+- 一个或多个大写 ASCII 字母
  • [a-z]+- 一个或多个小写 ASCII 字母

推荐阅读