如何在Java字符串中的每个大写字母前添加下划线?

如何在Java字符串中的每个大写字母前添加下划线?,java,string,replace,Java,String,Replace,我有一个像“HelloWorldMyNameIsCarl”这样的字符串,我希望它变成像“Hello\u World\u我的名字\u是\u Carl”这样的东西。我如何才能做到这一点?这里有一个提示,让您思考一个可能的解决方案: 找到一种在每个大写字母处将字符串拆分为多个部分的方法 用下划线将拆分的字符串重新连接起来 有用的关键字: 分裂 正则表达式/正则表达式 这是家庭作业吗?要开始,请执行以下操作: 创建字符串缓冲区 在字符串上迭代 检查每个字符是否为大写(java.lang.charact

我有一个像“HelloWorldMyNameIsCarl”这样的字符串,我希望它变成像“Hello\u World\u我的名字\u是\u Carl”这样的东西。我如何才能做到这一点?

这里有一个提示,让您思考一个可能的解决方案:

  • 找到一种在每个大写字母处将字符串拆分为多个部分的方法
  • 用下划线将拆分的字符串重新连接起来
  • 有用的关键字:

    • 分裂
    • 正则表达式/正则表达式

    • 这是家庭作业吗?要开始,请执行以下操作:

    • 创建字符串缓冲区
    • 在字符串上迭代
    • 检查每个字符是否为大写(
      java.lang.character
      class将提供帮助)
    • 如果是,则在缓冲区中添加下划线
    • 将当前字符追加到缓冲区

    • 是的,正则表达式可以为您做到这一点:

      "HelloWorldMyNameIsCarl".replaceAll("(.)([A-Z])", "$1_$2")
      
      表达式
      [A-Z]
      将匹配每个大写字母并将其放入第二组。您需要第一个组
      ,以避免替换第一个“H”

      如前所述,此解决方案不适用于任意语言。要捕获Unicode标准定义的任何大写字母,我们需要匹配所有大写字母的
      \p{Lu}
      。所以更一般的解决方案看起来像

      "HelloWorldMyNameIsCarl".replaceAll("(.)(\\p{Lu})", "$1_$2")
      

      感谢Piligrim。

      是否有意省略了“IsCarl”或您试图完成的部分内容?拆分或正则表达式似乎更为自然。+1-这对我来说似乎是一个完全可行的解决方案(特别是如果这是家庭作业)。问题中没有提到正则表达式,尽管它确实是这样标记的(在你发表评论之前,我真的没有注意到这一点)。也就是说,用regex做这样的事情是完全荒谬的。当人们不只是重复一个该死的列表时,总是让我感到毛骨悚然。这是一个简单、自然、显而易见的答案。regex会(显著地)更慢,更容易出现错误,在这种情况下,可能不太优雅/更长。不是说“优雅”是衡量代码的好标准,除非在少数情况下,它恰好与“可读”一致,我也一直使用正则表达式,但我不会在这里使用它,因为a)不管怎么说,这都是家庭作业,而且b)你可能错过了一些晦涩难懂的国际大写字母(是的,有一个带点的大写字母i!)@斯特凡·弗拉明没有帮助。粗体的尖叫也是如此。这是一个活生生的证据,证明了这句话有多么伟大::-)你对正则表达式有什么看法,ChssPly76?String.split删除了匹配的(=拆分)字符,因此在这里没有真正的帮助。@Rob-我没有偷任何东西,我已经…嗯。。。引用的引语:-)我完全同意你的观点;我只是不认为正则表达式是解决这个问题的最好方法。这就是说,OP确实将其标记为“正则表达式”(我在提供答案时没有注意到),因此我认为不相关:-)@ChssPly76:如果OP错误地假设使用正则表达式来解决问题,而你指出了陷阱,那么你认为什么是完全相关的。快告诉我。我不记得Java正则表达式替换是\1还是$1,所以我必须查找它。请注意,此解决方案(与ChssPly76给出的解决方案不同)不适用于所有大写字母,但仅适用于英文字母:ÄÜÎÔÛ等都缺失。我认为他的示例字符串暗示了英语。此外,这可以通过正确的正则表达式引擎进行调整,以处理unicode大写字符。这个概念仍然正确。根据java规范,\p{Lu}将适用于Unicode大写字母。所以正则表达式是“()(\\p{Lu})”