[java] 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"));
}



답변

이것은 테스트 케이스와 함께 작동합니다.

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, 내 뒤의 LC, 뒤의 LC

  XMLParser   AString    PDFLoader
    /\        /\           /\

내 뒤에 비 UC, 내 앞에 UC

 MyClass   99Bottles
  /\        /\

내 뒤에 편지, 내 앞에 편지가 아닌

 GL11    May5    BFG9000
  /\       /\      /\

참고 문헌

관련 질문

길이가 일치하지 않는 lookaround를 사용하여 분할 :


답변

당신은 그것을 사용하여 그것을 할 수 있습니다 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.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


답변

다음 정규식을 사용하여 단어 안의 대문자를 식별 할 수 있습니다.

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

모든 대문자, 즉 대문자가 아닌 문자 또는 숫자 뒤에 오는 에테르 또는 소문자와 문자 뒤에 나오는 모든 숫자와 일치합니다.

Java 기술을 넘어 서기 전에 공백을 삽입하는 방법 =)

숫자 케이스와 PDF 로더 케이스를 포함하도록 편집되었습니다.


답변

문자열을 반복하고 소문자에서 대문자로, 대문자에서 소문자로, 알파벳에서 숫자로, 숫자에서 알파벳으로의 변화를 감지해야한다고 생각합니다. 변경할 때마다 한 가지 예외를 제외하고 공백을 삽입합니다. 대문자에서 소문자로 변경하면 공백을 한 문자 앞에 삽입합니다.