Java Regex Tutorial

개요

자바에서 정규식은 java.util.regex 패키지에 포함된 클래스를 이용해서 사용할 수 있습니다.

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

Pattern Quantifiers

  1. Greedy
Enter your regex: .*foo // Greedy qualifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfooxxxxxxfoo" starting at index 0 and ending at index 13.

Greedy Quantifier는 가능한 한 많은 것과 일치합니다. 그래서 .*은 전체문자열(xfooxxxxxxfoo)과 일치합니다. 그런 다음 일치자는 f와 일치하려고 시도합니다. 그러나 남아있는 문자가 없습니다. 그래서 "backtracks(뒤로 가기)"를 합니다. 그러면 그리디 정규식 지정자가 한 개 덜 일치하도록 수정됩니다 (문자열 끝에 "o"가 남겨집니다). 그래도 정규식의 f와 일치하지 않습니다. 그래서 "backtracks"를 한 번 더 합니다. Greedy Quantifier가 한 개 덜 일치하도록 수정됩니다 (문자열 끝에 "oo"가 남겨집니다). 그래도 정규식의 f와 일치하지 않습니다. 그래서 "backtracks"를 한 번 더 합니다 (문자열 끝에 "foo"가 남겨집니다). 이제 일치자가 정규식의 f와 일치하고 o와 다음 o도 일치합니다. 성공!

  1. Reluctant
Enter your regex: .*?foo // Reluctant qualifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfoo" starting at index 0 and ending at index 4.
I found the text "xxxxxxfoo" starting at index 4 and ending at index 13.

Reluctant Quantifier 는 처음부터 가능한 한 적은 것과 일치합니다. 그래서 .*은 처음에는 아무것도 일치하지 않고, 전체 문자열이 일치하지 않는 상태로 남습니다. 그런 다음 일치자는 f와 일치하려고 시도합니다. 그러나 일치하지 않은 부분의 문자열은 "x"로 시작하기 때문에 일치하지 않습니다. 그래서 일치자가 "backtracks"를 합니다. 그러면 Reluctant Quantifier가 한 개 더 일치하도록 수정됩니다 (이제 "x"가 일치하고 "fooxxxxxxfoo"가 일치하지 않음). 그런 다음 f과 일치하려고 시도하고, 성공하고, 정규식에서 o와 다음 o도 일치합니다. 성공!

  1. Possessive
Enter your regex: .*+foo // Possessive qualifier
Enter input string to search: xfooxxxxxxfoo
No match found.

예제에서는, "xxxxxxfoo"이라는 남아있는 일치하지 않는 부분 문자열에서 같은 과정을 반복하여 시작합니다.

Possessive Quantifier는 Greedy Quantifier와 같지만 "backtracks"를 하지 않습니다. 그래서 .*이 전체 문자열과 일치하고, 일치하지 않는 것이 없도록 시작합니다. 그런 다음 정규식의 f와 일치할 것이 없습니다. 소유권 정규식 지정자가 "backtracks"를 하지 않기 때문에, 일치하지 않습니다.