Java에서 Camel Case를 사람이 읽을 수 있는 이름으로 변환하려면 어떻게 해야 합니까?
Camel Case를 사람이 읽을 수 있는 이름으로 변환하는 방법을 쓰고 싶습니다.
테스트 케이스는 다음과 같습니다.
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"));
}
이것은, 테스트 케이스에 대해서 유효합니다.
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와 함께 길이가 0인 일치 regex를 사용하여 공간을 삽입할 위치를 찾습니다.기본적으로 3가지 패턴이 있는데, 저는 이 패턴을String.format
더 쉽게 읽을 수 있도록 조합할 수 있습니다.
3가지 패턴은 다음과 같습니다.
UC는 내 뒤에, UC는 내 앞에, LC는 내 뒤에
XMLParser AString PDFLoader
/\ /\ /\
UC가 아닌 내 뒤에 UC가 내 앞에 있다.
MyClass 99Bottles
/\ /\
내 뒤에 편지가 있고 내 앞에 편지가 없다.
GL11 May5 BFG9000
/\ /\ /\
레퍼런스
관련 질문
길이 0 일치 룩어라운드를 사용하여 분할:
다음을 사용하여 할 수 있습니다.org.apache.commons.lang.StringUtils
StringUtils.join(
StringUtils.splitByCharacterTypeCamelCase("ExampleTest"),
' '
);
깔끔하고 짧은 솔루션:
StringUtils.capitalize(StringUtils.join(StringUtils.splitByCharacterTypeCamelCase("yourCamelCaseText"), StringUtils.SPACE)); // Your Camel Case Text
"복잡한" 정규식을 좋아하지 않고 효율성에 전혀 신경 쓰지 않는 경우, 이 예를 사용하여 동일한 효과를 3단계로 구현했습니다.
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();
숫자가 있는 경우를 포함하여 위의 모든 테스트 사례를 통과합니다.
말씀드렸듯이, 이것은 다른 예에서 하나의 정규 표현을 사용하는 것만큼 좋은 것은 아니지만, 누군가는 유용하다고 생각할 수 있습니다.
org.modesape.common.text를 사용할 수 있습니다.굴절기
구체적으로는:
String humanize(String lowerCaseAndUnderscoredWords, String... removableTokens)
첫 번째 단어를 대문자화하고 밑줄을 공백으로 변환하고 "_id" 후행과 제공된 이동식 토큰을 제거합니다.
Maven 아티팩트: org.modesape:modesape-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
다음 Regex를 사용하여 단어 안의 대소문자를 식별할 수 있습니다.
"((?<=[a-z0-9])[A-Z]|(?<=[a-zA-Z])[0-9]]|(?<=[A-Z])[A-Z](?=[a-z]))"
모든 대문자와 일치합니다.즉, 대문자가 아닌 문자 또는 숫자 뒤에 ether 또는 소문자 뒤에 이어지는 문자 및 문자 뒤에 오는 모든 숫자와 일치합니다.
그 앞에 공간을 삽입하는 방법은 내 Java 능력 밖이야 =)
숫자 대소문자와 PDF 로더 대소문자를 포함하도록 편집되었습니다.
문자열을 반복하여 소문자에서 대문자로, 대문자에서 소문자로, 영문자에서 숫자로, 숫자에서 영문자로의 변화를 감지해야 합니다.단, 변경이 검출될 때마다 공백 삽입(예외가1개 있습니다.대문자에서 소문자로 변경 시 공백 삽입은 1글자 전).
이것은 에서 동작합니다.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;
}
참고로 거의 (*) 호환되는 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"
.
다제네르빌리칸트에서 Regex를 꺼내서 물체의 확장 방법으로 바꿨습니다.
/// <summary>
/// Turns a given object into a sentence by:
/// Converting the given object into a <see cref="string"/>.
/// 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.
/// </summary>
/// <param name="original">The object to turn into a proper sentence.</param>
/// <returns>A string representation of the original object that reads like a real sentence.</returns>
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<string> wordsList = new List<string> { words[0] };
wordsList.AddRange(words.Skip(1).Select(word => word.Equals(word.ToUpper()) ? word : word.ToLower()));
words = wordsList.ToArray();
}
return string.Join(" ", words);
}
이것은 모든 것을 읽을 수 있는 문장으로 바꾼다.전달된 개체에서 ToString을 수행합니다.그런 다음 polygenelubicants에 의해 지정된 Regex를 사용하여 문자열을 분할합니다.그런 다음 ToLower는 첫 번째 단어와 약어를 제외한 각 단어를 삭제합니다.밖에 있는 누군가에게 유용할 것 같아서요
저는 정규 닌자가 아니기 때문에 현 위치 및 이전 위치의 인덱스를 체크하면서 스트링을 반복하고 있습니다.현재 위치가 대문자인 경우 이전 위치 뒤에 공백을 삽입하고 각 인덱스를 증가시킵니다.
http://code.google.com/p/inflection-js/
String.underscore().humanize() 메서드를 체인으로 하여 CamelCase 문자열을 사람이 읽을 수 있는 문자열로 변환할 수 있습니다.
언급URL : https://stackoverflow.com/questions/2559759/how-do-i-convert-camelcase-into-human-readable-names-in-java
'source' 카테고리의 다른 글
vuejs에서 vuex(디스패치) 오류 422가 발생하였습니다. (0) | 2022.08.31 |
---|---|
vuejs 템플릿 파일에 해시태그가 있는 템플릿 태그를 이해할 수 없습니다. (0) | 2022.08.30 |
strlcpy와 strlcat은 왜 안전하지 않다고 생각됩니까? (0) | 2022.08.30 |
C 구조의 멤버로서의 함수 포인터 (0) | 2022.08.30 |
Vue.js에서 v-for를 사용하여 개체의 어레이에 있는 항목에 액세스합니다. (0) | 2022.08.30 |