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

Zee*_*ran 1 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();
}
Run Code Online (Sandbox Code Playgroud)

输入:

IAmASentenceInCamelCaseWithNumbers500And1And37
Run Code Online (Sandbox Code Playgroud)

输出:

I Am A Sentence In Camel Case With Numbers 500 And 1 And 37
Run Code Online (Sandbox Code Playgroud)

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

失败的代码不起作用:

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

Pus*_*shi 5

完成您的工作的正确正则表达式和代码是这样的。

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

这输出,

Output: I Am A Sentence In Camel Case With Numbers 500 And 1 And 37
Run Code Online (Sandbox Code Playgroud)

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

如果输入字符串是,

ThisIsAnABBRFor1Abbreviation
Run Code Online (Sandbox Code Playgroud)

正则表达式需要一点修改,变成这样,[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());
Run Code Online (Sandbox Code Playgroud)

根据评论中的 OP ZeekAran 给出预期输出,

Input: This Is An ABBR For 1 Abbreviation
Run Code Online (Sandbox Code Playgroud)

  • 这与问题中的 unCamelCase 函数(略有)不同。如果原始输入已包含空格,则此方法可能会引入双空格。即此正则表达式替换不考虑`string.charAt(i - 1) != ' '`条件。 (2认同)