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_INSENSITIVE
Java에서) 대신 할 수 있습니다./(?i)regex/
- 정규식의 일부만 모드 켜기 및 끄기
- 당신은 또한 할 수 있습니다
/first(?i)second(?-i)third/
- 당신은 또한 할 수 있습니다
- 수정 자 범위
- 당신은 또한 할 수 있습니다
/first(?i:second)third/
- 당신은 또한 할 수 있습니다
- 정규식 내부에 모드 지정
- regular-expressions.info/Word Boundaries (항상
\b
a\w
와 a 사이 에 있음\s
)
관련 질문
답변
전체 표현식이 대소 문자를 구분하지 않으면 CASE_INSENSITIVE
플래그를 지정할 수 있습니다 .
Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
답변
패턴 일치를 확인할 초기 문자열을 소문자로 지정할 수도 있습니다. 그리고 패턴에 각각 소문자 기호를 사용하십시오.