자바 정규식을 이용하는 경우 아래와 같은 문제가 있다.
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.replace
나 String.matches
를 사용할경우 해당 플래스를 정규식에 포함해서 지정할 수 있다.
(?x)
, equivalent with Pattern.COMMENTS
(?m)
, equivalent with Pattern.MULTILINE
(?s)
, equivalent with Pattern.DOTTAL
(?u)
, equivalent with Pattern.UNICODE_CASE
(?d)
, equivalent with Pattern.UNIX_LINES
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