使用正则表达式取消驼峰式Java字符串

时间:2018-11-28 16:38:00

标签: java regex string

此代码似乎可以正常工作,但是我很想使用正则表达式对其进行清理。

 public static void main(String args[]) {
    String s = "IAmASentenceInCamelCaseWithNumbers500And1And37";
    System.out.println(unCamelCase(s));
}

public static String unCamelCase(String string) {
    StringBuilder newString = new StringBuilder(string.length() * 2);
    newString.append(string.charAt(0));
    for (int i = 1; i < string.length(); i++) {
        if (Character.isUpperCase(string.charAt(i)) && string.charAt(i - 1) != ' '
            || Character.isDigit(string.charAt(i)) && !Character.isDigit(string.charAt(i - 1))) {
            newString.append(' ');
        }
        newString.append(string.charAt(i));
    }
    return newString.toString();
}

输入:

IAmASentenceInCamelCaseWithNumbers500And1And37

输出:

I Am A Sentence In Camel Case With Numbers 500 And 1 And 37

我不喜欢使用该丑陋的if语句,我希望有一种方法可以使用利用正则表达式的一行代码。我尝试了一下,但是对包含1个或2个字母的单词会失败。

失败的代码无效:

return string.replaceAll("(.)([A-Z0-9]\\w)", "$1 $2");

3 个答案:

答案 0 :(得分:4)

适合您的工作的正则表达式和代码就是这个。

String s = "IAmASentenceInCamelCaseWithNumbers500And1And37";
System.out.println("Output: " + s.replaceAll("[A-Z]|\\d+", " $0").trim());

此输出

Output: I Am A Sentence In Camel Case With Numbers 500 And 1 And 37

编辑OP在评论中提出的查询答案:

如果输入字符串是

ThisIsAnABBRFor1Abbreviation

正则表达式需要进行一些修改,并变成[A-Z]+(?![a-z])|[A-Z]|\\d+,用于处理缩写。

此代码

String s = "ThisIsAnABBRFor1Abbreviation";
System.out.println("Input: " + s.replaceAll("[A-Z]+(?![a-z])|[A-Z]|\\d+", " $0").trim());

在评论中给出了OP ZeekAran的预期输出,

Input: This Is An ABBR For 1 Abbreviation

答案 1 :(得分:0)

我认为您可以尝试

let str = "IAmASentenceInCamelCaseWithNumbers500And1And37";

function unCamelCase(str){
  return str.replace(/(?:[A-Z]|[0-9]+)/g, (m)=>' '+m.toUpperCase()).trim();
}

console.log(unCamelCase(str));

  

说明

(?:[A-Z]|[0-9]+)

?:-非捕获组。

[A-Z]-匹配任意一个大写字符。

'|' -交替(与逻辑OR相同)。

[0-9]+-匹配0到9一次或多次的任何数字。

PS 对不起,JavaScript中的示例,但是在JAVA中可以很容易地实现相同的逻辑。

答案 2 :(得分:0)

您可以使用这种基于环视的正则表达式解决方案:

final String result = string.replaceAll(
   "(?<=\\S)(?=[A-Z])|(?<=[^\\s\\d])(?=\\d)", " ");

//=> I Am A Sentence In Camel Case With Numbers 500 And 1 And 37

RegEx Demo

RegEx详细信息:

正则表达式匹配两个条件之一,并用空格替换。它将忽略输入中已经存在的空格。

  • (?<=\\S)(?=[A-Z]):上一个字符为非空格,下一个字符为大写字母
  • |:或
  • (?<=[^\\s\\d])(?=\\d):上一个字符为非数字和空格,下一个为数字