此代码似乎可以正常工作,但是我很想使用正则表达式对其进行清理。
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");
答案 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详细信息:
正则表达式匹配两个条件之一,并用空格替换。它将忽略输入中已经存在的空格。
(?<=\\S)(?=[A-Z])
:上一个字符为非空格,下一个字符为大写字母|
:或(?<=[^\\s\\d])(?=\\d)
:上一个字符为非数字和空格,下一个为数字