这段代码似乎工作得很好,但我很想用正则表达式来清理它。
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)
完成您的工作的正确正则表达式和代码是这样的。
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)
| 归档时间: |
|
| 查看次数: |
299 次 |
| 最近记录: |