Это работает с вашими тестами:
static String splitCamelCase(String s) {
return s.replaceAll(
String.format("%s|%s|%s",
"(?<=[A-Z])(?=[A-Z][a-z])",
"(?<=[^A-Z])(?=[A-Z])",
"(?<=[A-Za-z])(?=[^A-Za-z])"
),
" "
);
}
Вот тестовый комплект:
String[] tests = {
"lowercase", // [lowercase]
"Class", // [Class]
"MyClass", // [My Class]
"HTML", // [HTML]
"PDFLoader", // [PDF Loader]
"AString", // [A String]
"SimpleXMLParser", // [Simple XML Parser]
"GL11Version", // [GL 11 Version]
"99Bottles", // [99 Bottles]
"May5", // [May 5]
"BFG9000", // [BFG 9000]
};
for (String test : tests) {
System.out.println("[" + splitCamelCase(test) + "]");
}
Он использует регулярное выражение сопоставления нулевой длины с lookbehind и lookforward, чтобы найти место для вставки пробелов. В основном есть 3 образца, и я использую String.format
, чтобы соединить их, чтобы сделать его более читабельным.
Три модели:
UC позади меня, UC и LC передо мной
XMLParser AString PDFLoader
/\ /\ /\
не-UC позади меня, UC передо мной
MyClass 99Bottles
/\ /\
Письмо позади меня, не письмо передо мной
GL11 May5 BFG9000
/\ /\ /\
Ссылки
Похожие вопросы
Использование сопоставления нулевой длины для разделения: