Fre*_*rik 149 java regex string camelcasing humanize
我想编写一个将CamelCase转换为人类可读名称的方法.
这是测试用例:
public void testSplitCamelCase() {
assertEquals("lowercase", splitCamelCase("lowercase"));
assertEquals("Class", splitCamelCase("Class"));
assertEquals("My Class", splitCamelCase("MyClass"));
assertEquals("HTML", splitCamelCase("HTML"));
assertEquals("PDF Loader", splitCamelCase("PDFLoader"));
assertEquals("A String", splitCamelCase("AString"));
assertEquals("Simple XML Parser", splitCamelCase("SimpleXMLParser"));
assertEquals("GL 11 Version", splitCamelCase("GL11Version"));
}
Run Code Online (Sandbox Code Playgroud)
pol*_*nts 322
这适用于您的测试用例:
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])"
),
" "
);
}
Run Code Online (Sandbox Code Playgroud)
这是一个测试工具:
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) + "]");
}
Run Code Online (Sandbox Code Playgroud)
它使用零长度匹配正则表达式与lookbehind和lookforward来查找插入空格的位置.基本上有3种模式,我用String.format
它们将它们放在一起以使其更具可读性.
这三种模式是:
XMLParser AString PDFLoader
/\ /\ /\
Run Code Online (Sandbox Code Playgroud)
MyClass 99Bottles
/\ /\
Run Code Online (Sandbox Code Playgroud)
GL11 May5 BFG9000
/\ /\ /\
Run Code Online (Sandbox Code Playgroud)
使用零长度匹配的外观来分割:
Ral*_*lph 110
你可以用它来做 org.apache.commons.lang.StringUtils
StringUtils.join(
StringUtils.splitByCharacterTypeCamelCase("ExampleTest"),
' '
);
Run Code Online (Sandbox Code Playgroud)
Sah*_*bra 15
整洁而简短的解决方案:
StringUtils.capitalize(StringUtils.join(StringUtils.splitByCharacterTypeCamelCase("yourCamelCaseText"), StringUtils.SPACE)); // Your Camel Case Text
Run Code Online (Sandbox Code Playgroud)
如果你不喜欢"复杂的"正则表达式,并且完全不关心效率,那么我已经用这个例子在三个阶段达到了同样的效果.
String name =
camelName.replaceAll("([A-Z][a-z]+)", " $1") // Words beginning with UC
.replaceAll("([A-Z][A-Z]+)", " $1") // "Words" of only UC
.replaceAll("([^A-Za-z ]+)", " $1") // "Words" of non-letters
.trim();
Run Code Online (Sandbox Code Playgroud)
它通过了上面的所有测试用例,包括带有数字的测试用例.
正如我所说,这不如在这里的其他一些例子中使用一个正则表达式那么好 - 但有人可能会发现它很有用.
您可以使用org.modeshape.common.text.Inflector.
特别:
Run Code Online (Sandbox Code Playgroud)String humanize(String lowerCaseAndUnderscoredWords, String... removableTokens)
将第一个单词大写并将下划线转换为空格并剥离尾随"_id"和任何提供的可移动标记.
Maven工件是:org.modeshape:modeshape-common:2.3.0.Final
在JBoss存储库:https://repository.jboss.org/nexus/content/repositories/releases
归档时间: |
|
查看次数: |
57955 次 |
最近记录: |