是否需要将下划线分隔的单词转换为可读格式?

时间:2019-01-08 08:46:04

标签: java regex string java-8

我需要将下划线分隔的单词(如NAME_OF_THINGS)转换为更好的可读格式(如“事物的名称”),在少数情况下,我需要诸如“事物的名称”的名称。

我有下面的代码,我使用谷歌番石榴的CaseFormat类进行了转换。但这并没有给我确切的预期结果。有人可以建议我将其转换为更好的方法吗?

StringUtils.join(StringUtils.splitByCharacterTypeCamelCase(
                 CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, input)), " ")

输入:NAME_OF_THINGS
预期:事物名称
当前:事物的名称

PS:我还需要类似“事物名称”(Of to of)

4 个答案:

答案 0 :(得分:3)

使用Java-8,您可以在一行中完成此操作:

String str = "NAME_OF_THINGS";

Arrays.stream(str.replaceAll("_", " ").toLowerCase().split(" "))
      .map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1) + " ")
      .forEach(System.out::print);

在这里,我们将所有出现的_替换为" ",然后将整个字符串转换为小写。接下来,我们基于" "对其进行拆分,然后执行子字符串操作以实现结果。

这给出了输出:

  

事物名称

仅获取首字母大写使用:

String newString = Character.toUpperCase(str.charAt(0)) + str.substring(1)
                            .replaceAll("_", " ").toLowerCase();

这给出了:

  

事物名称

答案 1 :(得分:0)

或者这个

input.substring(0,1) + input.substring(1).replaceAll("_", " ").toLowerCase()

答案 2 :(得分:0)

使用Pattern

String result = Pattern.compile("_")
                .splitAsStream(source)
                .map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1).toLowerCase())
                .collect(Collectors.joining(" "));

导致:

Name Of Things

答案 3 :(得分:0)

如果您确实不希望of大写,则可以再添加一个map函数来解决此问题:

Arrays.stream(str.toLowerCase().split("_"))
      .map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1) + " ")
      .map(e -> e.equalsIgnoreCase("Of ") ? "of " : e)
      .forEach(System.out::println);

或者如果您希望结果为String

String result = Arrays.stream(str.toLowerCase().split("_"))
      .map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1))
      .map(e -> e.equalsIgnoreCase("Of") ? "of" : e)
      .collect(Collectors.joining(" "));

输出:

Name of Things

然后,如果您想进一步概括您的任务以包含更多应大写的单词(“ And”,“ The”等),则可以创建一个所有单词的List应该大写并执行:

String newStr = Arrays.stream(str.toLowerCase().split("_"))
      .map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1))
      .map(e -> notCap.contains(e) ? notCap.get(notCap.indexOf(e)).toLowerCase() : e)
      .collect(Collectors.joining(" "));

notCap是您的List