我是靠谱客的博主 甜甜狗,最近开发中收集的这篇文章主要介绍java中使中文可读,正则表达式 - 如何在Java中将CamelCase转换为人类可读的名称?...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

正则表达式 - 如何在Java中将CamelCase转换为人类可读的名称?

我想编写一个将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个解决方案

306 votes

这适用于您的测试用例:

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

/ / /

参考

regular-expressions.info/Lookarounds

相关问题

使用零长度匹配的外观来分割:

正则表达式拆分字符串但保留分隔符

Java分裂正在吃我的角色

polygenelubricants answered 2019-05-13T01:53:20Z

98 votes

您可以使用org.apache.commons.lang.StringUtils进行操作

StringUtils.join(

StringUtils.splitByCharacterTypeCamelCase("ExampleTest"),

' '

);

Ralph answered 2019-05-13T01:53:44Z

9 votes

如果你不喜欢“复杂的”正则表达式,并且完全不关心效率,那么我已经用这个例子在三个阶段达到了同样的效果。

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();

它通过了上面的所有测试用例,包括带有数字的测试用例。

正如我所说,这不如在这里的其他一些例子中使用一个正则表达式那么好 - 但有人可能会发现它很有用。

jlb83 answered 2019-05-13T01:54:27Z

8 votes

整洁而简短的解决方案:

StringUtils.capitalize(StringUtils.join(StringUtils.splitByCharacterTypeCamelCase("yourCamelCaseText"), StringUtils.SPACE)); // Your Camel Case Text

Sahil Chhabra answered 2019-05-13T01:54:52Z

6 votes

您可以使用org.modeshape.common.text.Inflector。

特别:

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]

这是JAR文件:[https://repository.jboss.org/nexus/content/repositories/releases/org/modeshape/modeshape-common/2.3.0.Final/modeshape-common-2.3.0.Final.jar]

Hendy Irawan answered 2019-05-13T01:55:53Z

1 votes

以下正则表达式可用于识别单词内的大写字母:

"((?<=[a-z0-9])[A-Z]|(?<=[a-zA-Z])[0-9]]|(?<=[A-Z])[A-Z](?=[a-z]))"

它匹配每个大写字母,即非大写字母或数字后面的以太符号,或后跟小写字母和字母后面的每个数字。

如何在它们之前插入空格超出了我的Java技能=)

编辑包括数字案例和PDF Loader案例。

Jens answered 2019-05-13T01:56:38Z

1 votes

我认为你将不得不迭代字符串并检测从小写到大写,从大写到小写,从字母到数字,从数字到字母的变化。 在您检测到的每个更改中,插入一个空格,但有一个例外:在从大写到小写的更改中,您将空格插入前一个字符。

Felix answered 2019-05-13T01:57:03Z

1 votes

这适用于.NET ...根据您的喜好进行优化。 我添加了评论,以便您了解每件作品的作用。 (RegEx很难理解)

public static string SplitCamelCase(string str)

{

str = Regex.Replace(str, @"([A-Z])([A-Z][a-z])", "$1 $2"); // Capital followed by capital AND a lowercase.

str = Regex.Replace(str, @"([a-z])([A-Z])", "$1 $2"); // Lowercase followed by a capital.

str = Regex.Replace(str, @"(D)(d)", "$1 $2"); //Letter followed by a number.

str = Regex.Replace(str, @"(d)(D)", "$1 $2"); // Number followed by letter.

return str;

}

Xinbi answered 2019-05-13T01:57:27Z

0 votes

为了记录,这里是几乎(*)兼容的Scala版本:

object Str { def unapplySeq(s: String): Option[Seq[Char]] = Some(s) }

def splitCamelCase(str: String) =

String.valueOf(

(str + "A" * 2) sliding (3) flatMap {

case Str(a, b, c) =>

(a.isUpper, b.isUpper, c.isUpper) match {

case (true, false, _) => " " + a

case (false, true, true) => a + " "

case _ => String.valueOf(a)

}

} toArray

).trim

编译后,如果相应的scala-library.jar位于类路径中,则可以直接从Java中使用它。

(*)输入"GL11Version"失败,返回"G L11 Version"。

gerferra answered 2019-05-13T01:58:05Z

0 votes

我从polygenelubricants中获取了Regex并将其转换为对象的扩展方法:

///

/// Turns a given object into a sentence by:

/// Converting the given object into a .

/// Adding spaces before each capital letter except for the first letter of the string representation of the given object.

/// Makes the entire string lower case except for the first word and any acronyms.

///

/// The object to turn into a proper sentence.

/// A string representation of the original object that reads like a real sentence.

public static string ToProperSentence(this object original)

{

Regex addSpacesAtCapitalLettersRegEx = new Regex(@"(?<=[A-Z])(?=[A-Z][a-z]) | (?<=[^A-Z])(?=[A-Z]) | (?<=[A-Za-z])(?=[^A-Za-z])", RegexOptions.IgnorePatternWhitespace);

string[] words = addSpacesAtCapitalLettersRegEx.Split(original.ToString());

if (words.Length > 1)

{

List wordsList = new List { words[0] };

wordsList.AddRange(words.Skip(1).Select(word => word.Equals(word.ToUpper()) ? word : word.ToLower()));

words = wordsList.ToArray();

}

return string.Join(" ", words);

}

这将一切都变成了一个可读的句子。 它对传递的对象执行ToString。 然后它使用polygenelubricants给出的正则表达式来分割字符串。 然后它除了第一个单词和任何首字母缩略词之外的每个单词。 认为它可能对那里的人有用。

vbullinger answered 2019-05-13T01:58:37Z

-1 votes

我不是一个正则表达式的忍者,所以我会迭代字符串,保持当前位置的索引被检查&amp; 以前的位置。 如果当前位置是大写字母,我会在前一个位置后插入一个空格并递增每个索引。

Joel answered 2019-05-13T01:59:02Z

-3 votes

[http://code.google.com/p/inflection-js/]

您可以链接String.underscore()。humanize()方法以获取CamelCase字符串并将其转换为人类可读的字符串。

BeesonBison answered 2019-05-13T01:59:34Z

最后

以上就是甜甜狗为你收集整理的java中使中文可读,正则表达式 - 如何在Java中将CamelCase转换为人类可读的名称?...的全部内容,希望文章能够帮你解决java中使中文可读,正则表达式 - 如何在Java中将CamelCase转换为人类可读的名称?...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部