정규식은 문자열의 패턴을 정의합니다.
정규식을 사용하여 텍스트를 검색, 편집 또는 조작할 수 있습니다.
정규식은 하나의 언어에만 국한되지 않지만 각 언어에는 미묘한 차이가 있습니다.
Java 정규식은 Perl의 정규식과 가장 유사합니다.
java.util.regex 패키지에는 주로 다음 세 가지 클래스가 포함됩니다.
패턴 클래스:
패턴 객체는 정규식의 컴파일된 표현입니다. 패턴 클래스에는 공개 생성자가 없습니다. Pattern 객체를 생성하려면 먼저 Pattern 객체를 반환하는 공용 정적 컴파일 메서드를 호출해야 합니다. 이 메서드는 정규식을 첫 번째 매개변수로 받아들입니다.
일치자 클래스:
Matcher 객체는 입력 문자열을 해석하고 일치시키는 엔진입니다. Pattern 클래스와 마찬가지로 Matcher에는 공개 생성자가 없습니다. Matcher 객체를 얻으려면 Pattern 객체의 matcher 메서드를 호출해야 합니다.
패턴 구문예외:
PatternSyntaxException은 정규식 패턴의 구문 오류를 나타내는 필수가 아닌 예외 클래스입니다.
그룹 캡처는 여러 캐릭터를 괄호 안에 캐릭터를 그룹화하여 생성된 단일 단위로 처리하는 방법입니다.
예를 들어 정규식(dog)은 "d", "o" 및 "g"를 포함하는 단일 그룹을 만듭니다.
캡처 그룹은 왼쪽에서 오른쪽으로 여는 괄호를 세어 번호가 지정됩니다. 예를 들어, ((A)(B(C))) 표현식에는 다음과 같은 4개의 그룹이 있습니다.
((알파벳)))
(에이)
(기원전))
(기음)
matcher 객체의 groupCount 메서드를 호출하여 표현식에 포함된 그룹 수를 확인할 수 있습니다. groupCount 메서드는 일치자 개체에 현재 여러 캡처 그룹이 있음을 나타내는 int 값을 반환합니다.
항상 전체 표현식을 나타내는 특수 그룹(그룹 0)도 있습니다. 그룹은 groupCount의 반환 값에 포함되지 않습니다.
다음 예에서는 주어진 문자열에서 숫자로 구성된 문자열을 찾는 방법을 보여줍니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
공개 클래스 RegexMatches
{
공개 정적 무효 메인(문자열 인수[]){
// 지정된 패턴에 따라 문자열을 검색합니다. String line = "이 주문은 QT3000에 대한 것입니다! OK?";
문자열 패턴 = "(.*)(\d+)(.*)";
//Pattern 객체 생성 Pattern r = Pattern.compile(pattern);
// 이제 매처 객체를 생성합니다. Matcher m = r.matcher(line);
if (m.find( )) {
System.out.println("찾은 값: " + m.group(0) );
System.out.println("찾은 값: " + m.group(1) );
System.out.println("찾은 값: " + m.group(2) );
} 또 다른 {
System.out.println("일치하지 않음");
}
}
}
위 예제의 컴파일 및 실행 결과는 다음과 같습니다.
발견된 값: 이 주문은 QT3000에 대해 이루어졌습니다!
발견된 값: 이 주문은 QT300에 대해 이루어졌습니다.
발견된 값: 0
성격 | 설명하다 |
---|---|
| 다음 문자를 특수 문자, 텍스트, 역참조 또는 8진수 이스케이프 문자로 표시합니다. 예를 들어, "n"은 문자 "n"과 일치합니다. "n"은 개행 문자와 일치합니다. 시퀀스 "\"는 ""와 일치하고 "("는 "("와 일치합니다. |
^ | 입력 문자열의 시작 부분과 일치합니다. RegExp 개체의 Multiline 속성이 설정된 경우 ^는 "n" 또는 "r" 뒤의 위치와도 일치합니다. |
$ | 입력 문자열의 끝과 일치합니다. RegExp 개체의 Multiline 속성이 설정된 경우 $는 "n" 또는 "r" 앞의 위치와도 일치합니다. |
* | 선행 문자 또는 하위 표현식을 0회 이상 일치시킵니다. 예를 들어 zo*는 "z" 및 "zoo"와 일치합니다. * {0,}와 동일합니다. |
+ | 앞의 문자 또는 하위 표현식을 한 번 이상 일치시킵니다. 예를 들어, "zo+"는 "zo" 및 "zoo"와 일치하지만 "z"와는 일치하지 않습니다. + {1,}과 동일합니다. |
? | 앞의 문자 또는 하위 표현식을 0회 또는 1회 일치합니다. 예를 들어, "do(es)?"는 "dos"의 "do" 또는 "do"와 일치합니다. ? {0,1}과 동일합니다. |
{ N } | n은 음이 아닌 정수입니다. 정확히 n 번 일치합니다. 예를 들어, "o{2}"는 "Bob"의 "o"와 일치하지 않지만 "food"의 "o"는 모두 일치합니다. |
{ N ,} | n은 음이 아닌 정수입니다. n 번 이상 일치합니다. 예를 들어, "o{2,}"는 "Bob"의 "o"와 일치하지 않지만 "foooood"의 모든 o와 일치합니다. "o{1,}"은 "o+"와 동일합니다. "o{0,}"는 "o*"와 동일합니다. |
{ n , m } | M 과 n 은 음이 아닌 정수입니다. 여기서 n <= m 입니다. 최소 n 회, 최대 m 회 일치합니다. 예를 들어, "o{1,3}"은 "fooooood"의 처음 세 개의 o와 일치합니다. 'o{0,1}'은 'o?'와 동일합니다. 참고: 쉼표와 숫자 사이에는 공백을 삽입할 수 없습니다. |
? | 이 문자가 다른 한정자(*, +, ?, { n }, { n ,}, { n , m }) 바로 뒤에 오면 일치 패턴은 "비탐욕"입니다. "non-greedy" 패턴은 가능한 가장 짧은 문자열과 일치하고, 기본 "greedy" 패턴은 가능한 가장 긴 문자열과 일치합니다. 예를 들어 문자열 "oooo"에서 "o+?"는 단일 "o"에만 일치하는 반면 "o+"는 모든 "o"와 일치합니다. |
. | "rn"을 제외한 모든 단일 문자와 일치합니다. "rn"을 포함한 모든 문자를 일치시키려면 "[sS]"와 같은 패턴을 사용하십시오. |
( 패턴 ) | 패턴을 일치시키고 일치하는 하위 표현식을 캡처합니다. $0…$9 속성을 사용하여 결과 "일치" 컬렉션에서 캡처된 일치 항목을 검색할 수 있습니다. 대괄호 문자( )를 일치시키려면 "(" 또는 ")"를 사용하십시오. |
(?: 패턴 ) | 패턴 과 일치하지만 일치를 캡처하지 않는 하위 표현식입니다. 즉, 비캡처 일치이며 나중에 사용하기 위해 일치를 저장하지 않습니다. 이는 "or" 문자(|)를 사용하여 패턴 부분을 결합할 때 유용합니다. 예를 들어, 'industr(?:y|ies)는 'industry|industries'보다 더 경제적인 표현입니다. |
(?= 패턴 ) | 패턴 과 일치하는 문자열의 시작 부분에 있는 문자열과 일치하는 전방 예측 검색을 수행하는 하위 표현식입니다. 비캡처 일치, 즉 나중에 사용하기 위해 캡처할 수 없는 일치입니다. 예를 들어, 'Windows (?=95|98|NT|2000)'는 "Windows 2000"의 "Windows"와 일치하지만 "Windows 3.1"의 "Windows"와 일치하지 않습니다. 예측 미리보기는 문자를 차지하지 않습니다. 즉, 일치 항목이 발생한 후 예측 미리보기를 구성하는 문자 뒤가 아니라 이전 일치 항목 바로 다음에 다음 일치 항목이 검색됩니다. |
(?! 패턴 ) | 패턴 과 일치하는 문자열의 시작 부분에 있지 않은 검색 문자열과 일치하는 역방향 탐색 검색을 수행하는 하위 표현식입니다. 비캡처 일치, 즉 나중에 사용하기 위해 캡처할 수 없는 일치입니다. 예를 들어, 'Windows(?!95|98|NT|2000)'는 "Windows 3.1"의 "Windows"와 일치하지만 "Windows 2000"의 "Windows"와 일치하지 않습니다. 예측 미리보기는 문자를 차지하지 않습니다. 즉, 일치 항목이 발생한 후 예측 미리보기를 구성하는 문자 뒤가 아니라 이전 일치 항목 바로 다음에 다음 일치 항목이 검색됩니다. |
x | | x 또는 y 와 일치합니다. 예를 들어 'z|food'는 "z" 또는 "food"와 일치합니다. '(z|f)ood'는 "zood" 또는 "food"와 일치합니다. |
[ xyz ] | 문자 집합입니다. 에 포함된 모든 문자와 일치합니다. 예를 들어 "[abc]"는 "plain"의 "a"와 일치합니다. |
[^ xyz ] | 역방향 문자 집합. 포함되지 않은 모든 문자와 일치합니다. 예를 들어, "[^abc]"는 "plain"의 "p", "l", "i" 및 "n"과 일치합니다. |
[ 아즈 ] | 문자 범위. 지정된 범위 내의 모든 문자와 일치합니다. 예를 들어, "[az]"는 "a"부터 "z"까지의 범위에 있는 모든 소문자와 일치합니다. |
[^ az ] | 역방향 문자. 지정된 범위 내에 없는 모든 문자와 일치합니다. 예를 들어, "[^az]"는 "a"부터 "z"까지의 범위에 없는 모든 문자와 일치합니다. |
비 | 단어 경계, 즉 단어와 공백 사이의 위치를 일치시킵니다. 예를 들어, "erb"는 "never"의 "er"와 일치하지만 "동사"의 "er"와는 일치하지 않습니다. |
비 | 비단어 경계 일치. "erB"는 "동사"의 "er"와 일치하지만 "never"의 "er"는 일치하지 않습니다. |
cx | x 로 표시된 제어 문자와 일치합니다. 예를 들어 cM은 Control-M 또는 캐리지 리턴 문자와 일치합니다. x 값은 AZ 또는 az 사이에 있어야 합니다. 그렇지 않은 경우 c는 "c" 문자 자체로 간주됩니다. |
디 | 숫자 문자 일치. [0-9]와 동일합니다. |
디 | 숫자가 아닌 문자와 일치합니다. [^0-9]와 동일합니다. |
에프 | 양식 피드가 일치합니다. x0c 및 cL과 동일합니다. |
N | 개행 일치. x0a 및 cJ와 동일합니다. |
아르 자형 | 캐리지 리턴 문자와 일치합니다. x0d 및 cM과 동일합니다. |
에스 | 공백, 탭, 양식 피드 등을 포함한 모든 공백 문자와 일치합니다. [fnrtv]와 동일합니다. |
에스 | 공백이 아닌 문자와 일치합니다. [^fnrtv]와 동일합니다. |
티 | 탭 일치. x09 및 cI와 동일합니다. |
다섯 | 수직 탭 일치. x0b 및 cK와 동일합니다. |
w | 밑줄을 포함하여 모든 유형 문자와 일치합니다. "[A-Za-z0-9_]"와 동일합니다. |
W | 단어가 아닌 문자와 일치합니다. "[^A-Za-z0-9_]"와 동일합니다. |
xn | n 과 일치합니다. 여기서 n 은 16진수 이스케이프 코드입니다. 16진수 이스케이프 코드는 정확히 두 자리 길이여야 합니다. 예를 들어, "x41"은 "A"와 일치합니다. "x041"은 "x04"&"1"과 동일합니다. 정규식에 ASCII 코드를 허용합니다. |
번호 | num 과 일치합니다. 여기서 num 은 양의 정수입니다. 일치 항목을 캡처하기 위한 역참조입니다. 예를 들어, "(.)1"은 두 개의 연속된 동일한 문자와 일치합니다. |
N | 8진수 이스케이프 코드 또는 역참조를 식별합니다. n 앞에 n개 이상의 캡처 하위 표현식이 오면 n 은 역참조입니다. 그렇지 않고 n 이 8진수(0-7)이면 n 은 8진수 이스케이프 코드입니다. |
nm | 8진수 이스케이프 코드 또는 역참조를 식별합니다. nm 앞에 최소한 nm 캡처 하위 표현식이 오면 nm은 역참조입니다. nm 앞에 n 개 이상의 캡처가 오면 n은 역참조이고 그 뒤에 문자 m 이 옵니다. 이전 조건 중 어느 것도 존재하지 않으면 nm은 8진수 값 nm 과 일치합니다. 여기서 n 과 m 은 8진수(0-7)입니다. |
nml | n 이 8진수(0-3)이고 m 과 l 이 8진수(0-7)인 경우 8진수 이스케이프 코드 nml 을 일치시킵니다. |
u n | n 과 일치합니다. 여기서 n은 4자리 16진수로 표시되는 유니코드 문자입니다. 예를 들어 u00A9는 저작권 기호(©)와 일치합니다. |
index 메소드는 입력 문자열에서 일치 항목이 발견된 위치를 정확하게 나타내는 유용한 인덱스 값을 제공합니다.
일련번호 | 방법 및 지침 |
---|---|
1 | public int start()는 이전 일치 항목의 초기 인덱스를 반환합니다. |
2 | public int start(int group) 이전 일치 작업 중에 해당 그룹이 캡처한 하위 시퀀스의 초기 인덱스를 반환합니다. |
3 | public int end()는 마지막으로 일치하는 문자 뒤의 오프셋을 반환합니다. |
4 | public int end(int group) 이전 일치 작업 중에 해당 그룹이 캡처한 하위 시퀀스의 마지막 문자 뒤의 오프셋을 반환합니다. |
연구 방법은 입력 문자열을 검사하고 패턴이 발견되었는지 여부를 나타내는 부울 값을 반환합니다.
일련번호 | 방법 및 지침 |
---|---|
1 | public boolean lookingAt()는 범위의 시작 부분부터 시작하는 입력 시퀀스를 이 패턴과 일치시키려고 시도합니다. |
2 | public boolean find()는 이 패턴과 일치하는 입력 시퀀스의 다음 하위 시퀀스를 찾으려고 시도합니다. |
3 | public boolean find(int start) 이 매처를 재설정한 후 이 패턴과 일치하는 지정된 인덱스에서 시작하는 입력 시퀀스의 다음 하위 시퀀스를 찾으려고 시도합니다. |
4 | public boolean match()는 전체 범위를 패턴과 일치시키려고 시도합니다. |
교체 방법은 입력 문자열의 텍스트를 바꾸는 방법입니다.
일련번호 | 방법 및 지침 |
---|---|
1 | public Matcher AppendReplacement(StringBuffer sb, String replacement)는 비터미널 추가 및 교체 단계를 구현합니다. |
2 | public StringBuffer appendTail(StringBuffer sb)는 터미널 추가 및 교체 단계를 구현합니다. |
3 | public String replacementAll(String replacement) 패턴이 주어진 대체 문자열과 일치하는 입력 시퀀스의 모든 하위 시퀀스를 대체합니다. |
4 | public String replacementFirst(String replacement) 패턴이 주어진 대체 문자열과 일치하는 입력 시퀀스의 첫 번째 하위 시퀀스를 대체합니다. |
5 | public static String quoteReplacement(String s)는 지정된 문자열의 리터럴 대체 문자열을 반환합니다. 이 메서드는 Matcher 클래스의appendReplacement 메서드에 전달된 리터럴 문자열처럼 작동하는 문자열을 반환합니다. |
다음은 입력 문자열에서 "cat"이라는 단어의 발생 횟수를 계산하는 예입니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
공개 클래스 RegexMatches
{
개인 정적 최종 문자열 REGEX = "\bcat\b";
개인 정적 최종 문자열 INPUT =
"고양이 고양이 고양이 cattie 고양이";
공개 정적 무효 메인(문자열 인수[]){
패턴 p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // 일치자 개체를 가져옵니다. int count = 0;
동안(m.find()) {
카운트++;
System.out.println("일치 번호 "+count);
System.out.println("start(): "+m.start());
System.out.println("end(): "+m.end());
}
}
}
위 예제의 컴파일 및 실행 결과는 다음과 같습니다.
일치하는 번호 1
시작(): 0
끝(): 3
일치하는 번호 2
시작(): 4
끝(): 7
일치 번호 3
시작(): 8
끝(): 11
일치하는 번호 4
시작(): 19
종료(): 22
이 예에서는 문자 "c" "a" "t"가 단지 긴 단어의 하위 문자열이 아닌지 확인하기 위해 단어 경계를 사용하는 것을 볼 수 있습니다. 또한 입력 문자열에서 일치 항목이 발생한 위치에 대한 유용한 정보도 제공합니다.
start 메소드는 이전 일치 작업 중에 해당 그룹에 의해 캡처된 하위 시퀀스의 초기 인덱스를 반환하고, end 메소드는 마지막으로 일치된 문자의 인덱스에 1을 추가합니다.
match 및 lookingAt 메서드는 모두 입력 시퀀스 패턴을 일치시키는 데 사용됩니다. 차이점은 일치 시 전체 시퀀스가 일치해야 하지만 lookingAt에서는 그렇지 않다는 것입니다.
이 두 가지 방법은 입력 문자열의 시작 부분에 자주 사용됩니다.
이 기능을 설명하기 위해 다음 예를 사용합니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
공개 클래스 RegexMatches
{
private static final String REGEX = "foo";
private static final String INPUT = "fooooooooooooooooo";
개인 정적 패턴 패턴;
개인 정적 일치자 일치자;
공개 정적 무효 메인(문자열 인수[]){
패턴 = Pattern.compile(REGEX);
matcher = 패턴.매처(INPUT);
System.out.println("현재 REGEX는: "+REGEX);
System.out.println("현재 입력은: "+INPUT);
System.out.println(" lookingAt(): "+matcher. lookingAt());
System.out.println("matches(): "+matcher.matches());
}
}
위 예제의 컴파일 및 실행 결과는 다음과 같습니다.
현재 REGEX는 foo입니다.
현재 입력은 다음과 같습니다: fooooooooooooooooo
lookingAt(): 참
일치(): 거짓
정규식과 일치하는 텍스트를 바꾸는 데는 replacementFirst 및 replacementAll 메소드가 사용됩니다. 차이점은 replacementFirst는 첫 번째 일치 항목을 대체하고, replacementAll은 모든 일치 항목을 대체한다는 것입니다.
다음 예에서는 이 기능을 설명합니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
공개 클래스 RegexMatches
{
개인 정적 문자열 REGEX = "개";
private static String INPUT = "개가 야옹이라고 합니다. " +
"모든 개는 야옹이라고 말합니다.";
개인 정적 문자열 REPLACE = "cat";
공개 정적 무효 메인(String[] args) {
패턴 p = Pattern.compile(REGEX);
//매처 객체를 얻는다
일치자 m = p.matcher(INPUT);
INPUT = m.replaceAll(REPLACE);
System.out.println(INPUT);
}
}
위 예제의 컴파일 및 실행 결과는 다음과 같습니다.
고양이는 야옹이라고 말합니다. 모든 고양이는 야옹이라고 말합니다.
Matcher 클래스는 텍스트 교체를 위해 appReplacement 및 appendTail 메서드도 제공합니다.
이 기능을 설명하려면 다음 예를 살펴보십시오.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
공개 클래스 RegexMatches
{
개인 정적 문자열 REGEX = "a*b";
개인 정적 문자열 INPUT = "aabfooaabfooabfoob";
개인 정적 문자열 REPLACE = "-";
공개 정적 무효 메인(String[] args) {
패턴 p = Pattern.compile(REGEX);
// 일치자 객체를 가져옵니다. Matcher m = p.matcher(INPUT);
StringBuffer sb = new StringBuffer();
동안(m.find()){
m.appendReplacement(sb,REPLACE);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
위 예제의 컴파일 및 실행 결과는 다음과 같습니다.
-foo-foo-foo-
PatternSyntaxException은 정규식 패턴의 구문 오류를 나타내는 강제되지 않은 예외 클래스입니다.
PatternSyntaxException 클래스는 어떤 오류가 발생했는지 확인하는 데 도움이 되는 다음 메서드를 제공합니다.
일련번호 | 방법 및 지침 |
---|---|
1 | public String getDescription() 오류 설명을 가져옵니다. |
2 | public int getIndex()가 잘못된 인덱스를 가져옵니다. |
3 | public String getPattern() 이 잘못된 정규식 패턴을 가져옵니다. |
4 | public String getMessage()는 구문 오류 및 해당 인덱스에 대한 설명, 오류의 정규식 패턴 및 패턴의 오류 인덱스에 대한 시각적 표시가 포함된 여러 줄 문자열을 반환합니다. |