【问题标题】:How do I convert a camelCase string to underscore in java keeping some upper cases and the rests as lower cases?java - 如何在java中将camelCase字符串转换为下划线,保留一些大写,其余为小写?
【发布时间】:2017-02-24 07:47:53
【问题描述】:

如何在Java中将驼峰式字符串转换为下划线,保留一些大写字母?我正在使用此代码:

String inputString = "Hi How areYouToday";
String result = inputString.replaceAll("([a-z])([A-Z]+)", "$1_$2");   

我可以在Hi How are_You_Today 中转换 inputString,但是,我需要得到Hi How are_you_today

请注意,只有转换的部分更改为小写版本。

【问题讨论】:

    标签: java regex string replace camelcasing


    【解决方案1】:

    您可以使用Matcher#appendReplacement 并根据正则表达式找到的内容传递动态替换。

    我还稍微改变了你的正则表达式,不包括小写部分,但只接受前面有小写字符的大写字符。更多信息请访问:http://www.regular-expressions.info/lookaround.html

    String text = "Hi How areYouToday";
    Matcher m = Pattern.compile("(?<=[a-z])[A-Z]").matcher(text);
    
    StringBuffer sb = new StringBuffer();
    while (m.find()) {
        m.appendReplacement(sb, "_"+m.group().toLowerCase());
    }
    m.appendTail(sb);
    
    System.out.println(sb.toString()); //Hi How are_you_today
    

    或从 Java 9 开始

    Matcher m = Pattern.compile("(?<=[a-z])[A-Z]").matcher(text);
    String result = m.replaceAll(match -> "_" + match.group().toLowerCase());
    

    因为构造

    StringBuffer sb = new StringBuffer();
    while(m.find()){
        m.appendReplacement(sb, /*replacement for each match*/);
    }
    m.appendTail(sb);
    String result = sb.toString();
    

    被包裹到Matcher#replaceAll​(Function replacer),所以它可以用作

    String result = m.replaceAll( (MatchResult match) -> /*replacement for each match*/ );
    

    【讨论】:

    • 如果我们想把UpperCameCase改成下划线样式,比如AreYouToday改成are_you_today
    • @sajjadG 如果我们有"Hi How areYouToday"; 是否应该将HiHow 也简化为hihow
    • 是的,请 :-) 我使用了您的 sn-p 并将正则表达式更改为 ([A-Z]([a-z]+)) 并在您的 sn-p 添加 _ 后立即针对输入执行以将大小写更改为更低。它正在工作,但它是不同事物的两个不同正则表达式。我认为可以编写一个正则表达式来同时执行它们(从 CamelCase 更改为下划线并降低所有大小写)。
    • @sajjadG 你可以使用ideone.com/8Wk3Dw 之类的东西。想法是我们要检查大写字母之前是否为 a-z,或空格/字符串开头。 trim() 操作后的第二种情况将导致空字符串。如果是 a-z 那么我们需要在两者之间添加_,如果不是我们只需添加匹配的大写转换为小写。
    【解决方案2】:

    使用 substring 或 split() 将输入字符串拆分为 2 并在单个字符串上使用全部替换

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 2015-07-14
      • 2014-10-30
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多