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


111

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

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

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


이것을 확인하십시오. stackoverflow.com/a/55980176/3593084
Mr.Q

답변:



168

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

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

2
비트 포함 OR 연산 흠 .... ...Pattern.compile(myregex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)
닉 Grealy

4
이것은이 것보다 훨씬 더 읽기 (?i)
쉽습니다

이것은 4 년 전 relet의 답변과 동일한 답변이지만 모든 표를 얻습니다. 이상한.
Zoomzoom

@Zoomzoom, 내가 글을 썼을 때가 아니 었습니다. :) relet의 에디션 기록을 확인하면 2018 년에 변경된 것을 볼 수 있습니다. stackoverflow.com/posts/3436124/…
Christian Vielma

126

예, 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)

관련 질문


36

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

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)

답변 해주셔서 감사합니다. 이것은 정확히 내가 찾고 있던 것입니다. 파이썬에서는 re.IGNORECASE가 JAVA에서 비슷한 대답을 찾고있었습니다.
Doogle

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.