我想编写一个将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"));
}
12 回答
这适用于您的测试用例:
这是一个测试工具:
它使用零长度匹配正则表达式与lookbehind和lookforward来查找插入空格的位置 . 基本上有3种模式,我使用
String.format
将它们组合在一起以使其更具可读性 .这三种模式是:
UC在我身后,UC在我面前跟着LC
非UC在我身后,UC在我面前
在我身后的信,在我面前的非信
参考文献
相关问题
使用零长度匹配的外观来分割:
Regex split string but keep separators
Java split is eating my characters
你可以用
org.apache.commons.lang.StringUtils
来做如果你不喜欢“复杂的”正则表达式,并且完全不关心效率,那么我已经用这个例子在三个阶段达到了同样的效果 .
它通过了上面的所有测试用例,包括带有数字的测试用例 .
正如我所说,这不如在其他一些例子中使用一个正则表达式那么好 - 但有人可能会发现它很有用 .
整洁而简短的解决方案:
你可以使用org.modeshape.common.text.Inflector .
特别:
Maven神器是: org.modeshape:modeshape-common:2.3.0.Final
在JBoss存储库:https://repository.jboss.org/nexus/content/repositories/releases
这是JAR文件:https://repository.jboss.org/nexus/content/repositories/releases/org/modeshape/modeshape-common/2.3.0.Final/modeshape-common-2.3.0.Final.jar
以下正则表达式可用于识别单词内的大写:
它匹配每个大写字母,即非大写字母或数字之后的以太符号,或后跟小写字母和字母后的每个数字 .
如何在它们之前插入空格超出了我的Java技能=)
编辑包括数字案例和PDF Loader案例 .
我认为你将不得不迭代字符串并检测从小写到大写,从大写到小写,从字母到数字,从数字到字母的变化 . 在您检测到的每个更改中,插入一个空格,但有一个例外:在从大写到小写的更改中,您将空格插入前一个字符 .
这适用于.NET ...根据您的喜好进行优化 . 我添加了评论,以便您了解每件作品的作用 . (RegEx可能很难理解)
为了记录,这里是几乎(*)兼容的Scala版本:
编译后,如果相应的scala-library.jar位于类路径中,则可以直接从Java使用 .
(*)输入
"GL11Version"
失败,返回"G L11 Version"
.我从polygenelubricants中取出了Regex并将其转换为对象的扩展方法:
这将一切都变成了一个可读的句子 . 它对传递的对象执行ToString . 然后它使用polygenelubricants给出的正则表达式来分割字符串 . 然后它除了第一个单词和任何首字母缩略词之外,还要除了每个单词 . 认为它可能对那里的人有用 .
我不是一个正则表达式的忍者,所以我会迭代字符串,保持当前位置的索引被检查和之前的位置 . 如果当前位置是大写字母,我会在前一个位置后插入一个空格并递增每个索引 .
http://code.google.com/p/inflection-js/
您可以链接 String.underscore().humanize() 方法以获取CamelCase字符串并将其转换为人类可读的字符串 .