【问题标题】:Splitting CamelCase with regex用正则表达式拆分 CamelCase
【发布时间】:2014-02-15 02:38:39
【问题描述】:

我有这段代码可以通过正则表达式拆分 CamelCase:

Regex.Replace(input, "(?<=[a-z])([A-Z])", " $1", RegexOptions.Compiled).Trim();

但是,它没有正确拆分:ShowXYZColours

它产生Show XYZColours 而不是Show XYZ Colours

如何获得想要的结果?

【问题讨论】:

    标签: c# regex camelcasing


    【解决方案1】:

    Unicode 感知

    (?=\p{Lu}\p{Ll})|(?<=\p{Ll})(?=\p{Lu})
    

    细分:

    (?= #look-ahead: 一个位置后跟... \p{Lu}\p{Ll} # 一个大写和一个小写 ) # | # 要么 (?

    与您的正则表达式拆分函数一起使用。


    编辑:当然,您可以将 \p{Lu} 替换为 [A-Z] 并将 \p{Ll} 替换为 [a-z],如果这是您需要的,或者您的正则表达式引擎不理解 Unicode 类别。

    【讨论】:

      【解决方案2】:

      .NET DEMO

      你可以使用这样的东西:

      (?<=[a-z])([A-Z])|(?<=[A-Z])([A-Z][a-z])
      

      代码:

      string strRegex = @"(?<=[a-z])([A-Z])|(?<=[A-Z])([A-Z][a-z])";
      Regex myRegex = new Regex(strRegex, RegexOptions.None);
      string strTargetString = @"ShowXYZColours";
      string strReplace = @" $1$2";
      
      return myRegex.Replace(strTargetString, strReplace);
      

      输出:

      Show XYZ Colours
      

      Demo and Explanation

      【讨论】:

      • 那是失去“颜色”中的“Co”
      • 谢谢你提醒我:),我更新了我的答案。
      【解决方案3】:

      使用 Tomalak 的正则表达式和 .NET System.Text.RegularExpressions 在结果数组的位置 0 处创建一个空条目:

      Regex.Split("ShowXYZColors", @"(?=\p{Lu}\p{Ll})|(?<=\p{Ll})(?=\p{Lu})")
      
      {string[4]}
          [0]: ""
          [1]: "Show"
          [2]: "XYZ"
          [3]: "Colors"
      

      它适用于 caMelCase(与 PascalCase 相对):

      Regex.Split("showXYZColors", @"(?=\p{Lu}\p{Ll})|(?<=\p{Ll})(?=\p{Lu})")
      
      {string[3]}
          [0]: "show"
          [1]: "XYZ"
          [2]: "Colors"
      

      【讨论】:

        【解决方案4】:

        你可以试试这个:

        Regex.Replace(input, "((?<!^)([A-Z][a-z]|(?<=[a-z])[A-Z]))", " $1").Trim();
        

        示例:

        Regex.Replace("TheCapitalOfTheUAEIsAbuDhabi", "((?<!^)([A-Z][a-z]|(?<=[a-z])[A-Z]))", " $1").Trim();
        

        输出: 阿联酋的首都是阿布扎比

        【讨论】:

          猜你喜欢
          • 2011-05-30
          • 1970-01-01
          • 2011-09-28
          • 1970-01-01
          • 1970-01-01
          • 2012-11-05
          • 2013-08-11
          相关资源
          最近更新 更多