[java] Java RegEx는 대소 문자를 구분하지 않습니까?

Java에서 replaceAll을 수행하여 다음과 같은 정규식 패턴을 찾을 때 :

replaceAll("\\?i\\b(\\w+)\\b(\\s+\\1)+\\b", "$1"); 

내가 어디다 잘 모르겠어요, (중복 연속 대소 문자를 구분 즉, 예를 들어, 시험 테스트를 제거합니다) ?i. 나는 그것이 처음에 있어야한다고 읽었지만, 내가 그것을 꺼내면 나는 중복 된 연속 단어 (예 : 테스트 테스트)를 잡지 만, 대소 문자를 구분하지 않는 단어 (예 : 테스트 테스트)는 발견하지 않습니다. 그래서 나는 처음에? i를 추가 할 수 있다고 생각했지만 그것은 일을 끝내지 못하는 것 같습니다. 이견있는 사람? 감사!



답변

RegexBuddy 는 처음에 포함할지 여부를 알려주며 올바른 구문입니다.

"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"


답변

다음과 같이 Pattern.CASE_INSENSITIVE 상수를 사용하여 대소 문자를 구분하지 않는 정규식을 일치시키고 더 읽기 쉽게 만들 수도 있습니다.

Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
Matcher mymatcher= mypattern.matcher(mystring);


답변

예, Java regex에서 대소 문자 구분을 임의로 활성화 및 비활성화 할 수 있습니다.

다음과 같은 것을 원하는 것 같습니다.

    System.out.println(
        "Have a meRry MErrY Christmas ho Ho hO"
            .replaceAll("(?i)\\b(\\w+)(\\s+\\1)+\\b", "$1")
    );
    // Have a meRry Christmas ho

점을 유의 내장 Pattern.CASE_INSENSITIVE 플래그가 (?i)없습니다 \?i. \b패턴에서 하나의 불필요한 항목 이 제거되었습니다.

(?i)패턴의 시작 부분에 배치되어 대소 문자를 구분하지 않습니다. 이 특별한 경우에는 나중에 패턴에서 재정의되지 않으므로 실제로 전체 패턴은 대소 문자를 구분하지 않습니다.

사실 대소 문자 구분을 전체 패턴의 일부로 만 제한 할 수 있다는 점은 주목할 가치가 있습니다. 따라서 어디에 넣을 지에 대한 질문은 실제로 사양에 따라 다릅니다 (이 특정 문제의 \w경우 대소 문자를 구분 하지 않기 때문에 중요하지 않습니다 .

설명하기 위해 다음과 같은 문자를 축소하는 유사한 예가 "AaAaaA"있습니다 "A".

    System.out.println(
        "AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
            .replaceAll("(?i)\\b([A-Z])\\1+\\b", "$1")
    ); // A e I O u

이제 런이 대문자로 시작하는 경우에만 축소되도록 지정한다고 가정합니다. 그런 다음 (?i)적절한 위치에 배치 해야합니다 .

    System.out.println(
        "AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
            .replaceAll("\\b([A-Z])(?i)\\1+\\b", "$1")
    ); // A eeEeeE I O uuUuUuu

보다 일반적으로 원하는대로 패턴 내에서 플래그를 활성화 및 비활성화 할 수 있습니다.

또한보십시오

  • java.util.regex.Pattern
  • 정규식 .info / Modifiers
    • 정규식 내부에 모드 지정
      • /regex/i( Pattern.CASE_INSENSITIVEJava에서) 대신 할 수 있습니다./(?i)regex/
    • 정규식의 일부만 모드 켜기 및 끄기
      • 당신은 또한 할 수 있습니다 /first(?i)second(?-i)third/
    • 수정 자 범위
      • 당신은 또한 할 수 있습니다 /first(?i:second)third/
  • regular-expressions.info/Word Boundaries (항상 \ba \w와 a 사이 에 있음 \s)

관련 질문


답변

전체 표현식이 대소 문자를 구분하지 않으면 CASE_INSENSITIVE플래그를 지정할 수 있습니다 .

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)


답변

패턴 일치를 확인할 초기 문자열을 소문자로 지정할 수도 있습니다. 그리고 패턴에 각각 소문자 기호를 사용하십시오.


답변