Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要将下划线分隔的单词转换为人类可读的形式吗?_Java_Regex_String_Java 8 - Fatal编程技术网

Java 需要将下划线分隔的单词转换为人类可读的形式吗?

Java 需要将下划线分隔的单词转换为人类可读的形式吗?,java,regex,string,java-8,Java,Regex,String,Java 8,我需要将下划线分隔的单词(如事物名称)转换为可读性更好的格式(如“事物名称”),在少数情况下,我需要类似“事物名称”的格式 我有下面的代码,我转换使用谷歌番石榴的CaseFormat类。但它没有给我确切的预期结果。有人能给我建议一个更好的转换方法吗 StringUtils.join(StringUtils.splitByCharacterTypeCamelCase( CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_

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

我有下面的代码,我转换使用谷歌番石榴的CaseFormat类。但它没有给我确切的预期结果。有人能给我建议一个更好的转换方法吗

StringUtils.join(StringUtils.splitByCharacterTypeCamelCase(
                 CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, input)), " ")
输入:事物的名称
预期:事物名称
实际:事物的名称


PS:我还需要类似于事物名称(of to of)的东西

使用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();
这使得:

事物的名称

还是这个

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

使用
模式

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

Name Of Things

如果您真的不想将的大写,您可以再添加一个映射函数来处理此问题:

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 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(" "));
输出:

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

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
是您的
列表

由于“适当的标题格”在文化上是可变的(例如,在英语中,我们知道标题中应该是“of”而不是“of”),因此您可能需要使用自己的附加意义检查功能。在您的示例中,“Expected”实际上是句子的大小写,因为东西不是大写的。句子大小写=事物的名称。标题格(正确)=事物名称。标题大小写(来自文化不可知结果)=事物名称。“
s.substring(0,1).toUpperCase()
”->
Character.toUpperCase(s.charAt(0))
。但是,根据预期的输出,无论如何,只有第一个单词应该大写。@Nichold问这个问题,我甚至可以用我共享的上述代码实现。但我需要像“事物名称”和“事物名称”这样的东西。如果我的问题不正确,我很抱歉clear@NicholasK这解决了我的主要问题。但我也需要类似于事物名称的东西。可能吗?或者我应该编写一个单独的函数,将
转换为
,您可能需要修改第二个代码段以获得结果。我将把它留给你作为一个练习:(它应该相当直接)同时,如果答案有帮助,请考虑接受/接受它。
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(" "));