정규식 패턴 매칭 플래그

매칭 플래그

예전회사에서 유용하게 사용했던 정규식중에 특수문자를 제거하는 방식이 있다.
예를들어 xml 주석을 제거하고싶다 하면

xml.replaceAll("(?s)<!--.*?-->","");

해당 방식을 사용할때 (?s)가 정확히 무엇인지 알수가 없었는데 이번 특정 Unicode를 제거하는 업무를 진행하면서 매칭 플래그라는 이름으로 사용된다는것을 알 수 있었다.

종류

여러개의 플래그를 사용할 때는 | 연산자로 연결한다. 플래그를 정규식의 맨 앞에 명시해야한다.

Pattern.CANON_EQ          None  표준화된 매칭 모드를 활성화합니다. 이 모드가 켜지면 a를 나타내는 유니코드 "\u00E5"와 a와 상단고리 유니코드를 쓴 "a\u030A"를 같다고 매칭합니다.
Pattern.CASE_INSENSITIVE  (?i)  대소문자를 구분하지 않습니다.
Pattern.COMMENTS          (?x)  공백과 주석이 무시됩니다. 주석은 #부터 그 행 끝까지 입니다.
Pattern.MULTILINE         (?m)  다중행 모드를 사용여 모든 ^와 $가 인식됩니다. 기본값은 입력값 전체를 하나의 시작과 끝으로 인식합니다.
Pattern.DOTALL            (?s)  .가 개행문자 까지 포함하는 모든 문자로 매칭됩니다.
Pattern.LITERAL           None  입력의 메타문자와 이스케이프된 문자를 일반 문자로 취급합니다. CASE_INSENSITIVE와 UNICODE_CASE는 기능이 유지됩니다.
Pattern.UNICODE_CASE      (?u)  이 모드가 활성화 되면 대소문자 매칭이 유니코드 표준을 따릅니다. 기본은 US-ASCII 문자 집합을 따릅니다.
Pattern.UNIX_LINES        (?d)  ^와 $를 처리시 UNIX 개행을 사용합니다.

예시

(?)로 사용할수 있는 플래그는 정규식에 직접 기입하면 되지만 None인 경우는 다음과 같은 방식으로 처리해야한다.

//Regular expression to find the required character
String regex = "["+ch+"]";
//Compiling the regular expression
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
//Retrieving the matcher object
Matcher matcher = pattern.matcher(input);
int count =0;
while (matcher.find()) {
     count++;
}

(?)로 사용할수 있는 플래그는 직접 명시

System.out.println("this\nis\ntest".replaceAll("(?s)(^.*$)", "B"));
System.out.println("this\nis\ntest".replaceAll("(?m)(^.*$)", "C"));

//Result
B // 개행 포함되어 B
C // 라인별로 \n을 포함한채로 치환하여 3라인
C
C

좋은 웹페이지 즐겨찾기