정규표현식
혹은 정규식
은 특정 문자열의 규칙을 가지는 문자열의 집합을 표현하는 데 사용되는 언어 를 의미합니다.자바에서 정규 표현식을 사용하기 위해 특별한 설정이 필요하지 않습니다. JDK에는 regex 작업에 완전히 특화된 java.util.regex
라는 특별한 패키지가 포함되어 있습니다. 우리는 그것을 코드에 가져오기만 하면 됩니다.
또한, java.lang.String 클래스에도 내장된 regex 지원이 있어서 우리 코드에서 흔히 사용합니다.
java.util.regex 패키지에는 세 가지 클래스가 포함되어 있습니다: Pattern, Matcher 및 PatternSyntaxException:
Pattern 오브젝트는 컴파일된 정규식입니다. Pattern 클래스는 공개 생성자가 없습니다. 패턴을 만들려면 먼저 정규 표현식을 첫 번째 인수로 사용하여 그 public static compile 메서드 중 하나를 호출해야 합니다. 이러한 메서드는 정규 표현식을 첫 번째 인수로 받습니다.
Matcher 오브젝트는 패턴을 해석하고 입력 문자열에 대한 일치 작업을 수행합니다. 또한 공개 생성자가 없습니다. 패턴 오브젝트에서 matcher 메서드를 호출하여 Matcher 오브젝트를 얻습니다.
PatternSyntaxException 오브젝트는 정규 표현식 패턴의 구문 오류를 나타내는 확인되지 않은 예외입니다.
이러한 클래스를 자세히 살펴보겠지만, 먼저 자바에서 정규식을 구성하는 방법을 이해해야 합니다.
java.util.regex API에서 지원하는 패턴 매칭의 가장 기본적인 형태는 문자열 리터럴의 일치입니다. 예를 들어, 정규식이 "foo"이고 입력 문자열이 "foo"이면, 일치가 성공합니다.
@Test
public void givenText_whenSimpleRegexMatches_thenCorrect() {
Pattern pattern = Pattern.compile("foo");
Matcher matcher = pattern.matcher("foo");
assertTrue(matcher.find());
}
메타 문자는 패턴이 일치하는 방식에 영향을 미치며, 어떤 의미로는 검색 패턴에 논리를 추가합니다. Java API는 여러 메타 문자를 지원하며, 가장 간단한 것은 점 "."으로 모든 문자와 일치합니다.
API는 <([{\^-=$!|]})?*+.>
와 같은 다른 메타 문자를 지원한다.
@Test
public void givenText_whenMatchesWithDotMetach_thenCorrect() {
int matches = runTest(".", "foo");
assertTrue(matches > 0);
}
공식 Pattern 클래스 사양을 통해 지원되는 정규식 구문 요약을 찾을 수 있습니다. 문자 클래스 아래에는 약 6개의 구문이 있습니다.
우리는 하이픈(-)을 사용하여 일치하는 텍스트의 범위를 지정하는 클래스를 정의할 수 있습니다. 마찬가지로 범위를 부정할 수도 있습니다.
합집합 문자 클래스는 두 개 이상의 문자 클래스를 결합한 결과입니다
[1-3[7-9]] -> [1,2,3,7] -> [1,2,3,7,8,9]
합집합 클래스와 유사하게, 이 클래스는 두 개 이상의 집합 사이에 공통 요소를 선택하여 생성됩니다. 교집합을 적용하기 위해 &&
를 사용합니다
우리는 하나 이상의 문자 클래스를 부정하기 위해 차집합을 사용할 수 있습니다. 예를 들어, 홀수인 십진수의 집합을 일치시킬 수 있습니다
@Test
public void givenBraceQuantifierWithRange_whenMatches_thenCorrect() {
int matches = runTest("a{2,3}", "aaaa");
assertEquals(matches, 1);
}
여기서는 최소 두 번 발생하되 세 번을 초과하지 않도록 지정했으므로 matcher는 하나의 일치만 발견하게 됩니다. matcher는 단일한 aaa와 나머지 a를 발견할 수 없기 때문입니다.
그러나 API는 탐욕적이지 않거나 자유로운 방식을 지정할 수 있도록 해줍니다. 이렇게 하면 matcher가 범위의 하위에서 시작하여 aa와 aa로 두 번 일치될 수 있습니다
API는 또한 캡처링 그룹을 통해 여러 문자를 하나의 단위로 취급할 수 있도록 해줍니다. 캡처링 그룹에 번호를 붙이고, 이 번호를 사용하여 백 레퍼런싱(back referencing)을 허용합니다.
^ : 시작과 함께 문자가 나올때만 찾음
$ : 텍스트 끝부분에 일치하는지 찾음
\b : 단어 포함하는지 찾음