목차

정규식에서 embedded flag expression 사용하기

문제점

자바 정규식을 이용하는 경우 아래와 같은 문제가 있다.

	public static void Test() {
		String a1 = "가나다라\r\n마바사\r\n아자차";
		String a2 = "가나다라 마바사 아자차";
		
		System.out.println(a1.matches(".*바.*"));
		System.out.println(a2.matches(".*바.*"));
	}

a1 : false
a2 : true

위의 내용에서처럼 정규식 결과에 의하면 a1이든 a2이든 모두 true가 나와야 하지만 a1처럼 문자열 내에 CRLF가 포함되어있는 경우에는 인식하지 못한다.

이것은 정규식을 이용하는 String 관련 메소드들이 Pattern클래스를 참조하는데 기본적으로 Pattern.DOTALL 플래그가 비활성화되어있기 때문이다.
Pattern클래스를 이용하는 방법으로 변경해도 되지만 간단하게 String.replaceString.matches 를 사용할경우 해당 플래스를 정규식에 포함해서 지정할 수 있다.

package org.kodejava.regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EmbeddedFlagDemo {
    public static void main(String[] args) {
        // Define regex which starting with (?i) to enable
        // case-insensitive matching
        String regex = "(?i)the";
        String text = "The quick brown fox jumps over the lazy dog";

        // Obtain the required matcher
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(text);

        // Find every match and print it
        while (matcher.find()) {
            System.out.format("Text \"%s\" found at %d to %d.%n",
                    matcher.group(), matcher.start(),
                    matcher.end());
        }
    }
}

따라서 맨 위의 예저의 경우 아래와 같이 변경 가능하다.

	public static void Test() {
		String a1 = "가나다라\r\n마바사\r\n아자차";
		String a2 = "가나다라 마바사 아자차";
		
		System.out.println(a1.matches("(?s).*바.*"));
		System.out.println(a2.matches("(?s).*바.*"));
	}

a1 : true
a2 : true

참조링크