【问题标题】:Splitting a CamelCased text [duplicate]拆分 CamelCased 文本 [重复]
【发布时间】:2018-03-06 08:56:48
【问题描述】:

我需要拆分仅包含 lowerCaseUpperCase 字母的 camelCased 文本。如何使用正则表达式?

示例文本: ThisTextIsToBeSplitted

输出:此文本将被拆分

【问题讨论】:

  • “ThisTEXTIsToBeSplitted”的输出应该是什么?
  • 请查看这个帖子:stackoverflow.com/questions/7593969/…很好的解释
  • 你可以看到my answer@Longer04 上面的帖子。正则表达式可以在多种语言中使用,而不仅仅是 Java,并且不依赖于负面的lookbehinds。我发现它比这篇文章和链接的大多数正则表达式更容易阅读,但这是我个人的观点,绝对是偏见

标签: java regex split


【解决方案1】:

你可以使用正则表达式

(?=[A-Z])

regex101 demoonline compiler

【讨论】:

    【解决方案2】:
    String s = "ThisTextIsToBeSplitted";
    System.out.println(Arrays.asList(s.split("(?=[A-Z])")));
    

    工作正常。我的输出是:

    [This, Text, Is, To, Be, Splitted]
    

    对于 Stephen 的示例,输出为 [This, T, E, X, T, Is, To, Be, Splitted],因为它会在每个大写字母处吐出

    【讨论】:

      【解决方案3】:

      我会提供以下解决方案,它保留了首字母缩略词(例如ABC),而其他答案则没有:

      String input = "ThisTextWithInitialABCIsToBeSplitted";
      String[] parts = input.split("((?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z]))");
      for (String part : parts) {
          System.out.println(part);
      }
      

      输出:

      This
      Text
      With
      Initial
      ABC
      Is
      To
      Be
      Splitted
      

      拆分的逻辑是使用断言但不消耗的外观。分裂发生在以下两种情况之一:

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

      第一个条件是当我们在一个位置紧接前面是一个小写字母并且紧接着是一个大写字母继续。但仅凭此规则,字符串InitialABCIs 将拆分为:

      Intitial
      ABCI
      s
      

      为了解决这个问题,我添加了第二个条件,当前面的字母是大写字母时拆分,然后是一个大写字母和一个小写字母。这使我们能够分离下一个驼峰单词的真正开头。

      演示在这里:

      Rextester

      【讨论】:

        【解决方案4】:

        我已经完成了表达式:(?=\\p{Upper})

        【讨论】:

          猜你喜欢
          • 2014-05-02
          • 1970-01-01
          • 2018-12-28
          • 2011-09-08
          • 2011-11-03
          • 1970-01-01
          • 1970-01-01
          • 2015-03-18
          • 1970-01-01
          相关资源
          最近更新 更多