자바 정규식


정규 표현식은 문자열의 패턴을 정의합니다.

정규 표현식을 사용하여 텍스트를 검색, 편집 또는 처리할 수 있습니다.

정규 표현식은 하나의 언어에만 국한되지 않고 각 언어마다 미묘한 차이가 있습니다.

Java 정규식은 Perl의 정규식과 가장 유사합니다.

java.util.regex 패키지에는 주로 다음 세 가지 클래스가 포함됩니다.

  • 패턴 클래스:

    pattern 개체는 정규식의 컴파일된 표현입니다. 패턴 클래스에는 공개 생성자가 없습니다. Pattern 객체를 생성하려면 먼저 Pattern 객체를 반환하는 공용 정적 컴파일 메서드를 호출해야 합니다. 이 메서드는 정규식을 첫 번째 매개변수로 받아들입니다.

  • Matcher 클래스:

    Matcher 객체는 입력 문자열을 해석하고 일치시키는 엔진입니다. Pattern 클래스와 마찬가지로 Matcher에는 공개 생성자가 없습니다. Matcher 객체를 얻으려면 Pattern 객체의 matcher 메서드를 호출해야 합니다.

  • PatternSyntaxException:

    PatternSyntaxException은 정규식 패턴의 구문 오류를 나타내는 필수가 아닌 예외 클래스입니다.


캡쳐 그룹

캡쳐 그룹은 여러 문자를 하나의 단위로 취급하는 방식으로, 괄호 안에 문자를 묶어서 생성됩니다.

예를 들어 정규 표현식(dog)은 "d", "o" 및 "g"를 포함하는 단일 그룹을 만듭니다.

캡처 그룹은 왼쪽에서 오른쪽으로 여는 괄호를 세어 번호가 매겨집니다. 예를 들어, ((A)(B(C))) 표현식에는 4개의 그룹이 있습니다:

  • ((A)(B(C)))

  • (A)

  • (B(C))

  • (C)

매처 객체의 groupCount 메서드를 호출하면 해당 표현식에 몇 개의 그룹이 있는지 확인할 수 있습니다. groupCount 메서드는 일치자 개체에 현재 여러 캡처 그룹이 있음을 나타내는 int 값을 반환합니다.

항상 전체 표현을 나타내는 특수 그룹(그룹 0)도 있습니다. 그룹은 groupCount의 반환 값에 포함되지 않습니다.

예제

다음 예는 주어진 문자열에서 숫자 문자열을 찾는 방법을 보여줍니다.

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

public class RegexMatches
{
    public static void main( String args[] ){

      // 按指定模式在字符串查找
      String line = "This order was placed for QT3000! OK?";
      String pattern = "(.*)(\d+)(.*)";

      // 创建 Pattern 对象
      Pattern r = Pattern.compile(pattern);

      // 现在创建 matcher 对象
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );
      } else {
         System.out.println("NO MATCH");
      }
   }
}

위 예는 다음과 같이 결과를 컴파일하고 실행합니다.

Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0

정규 표현식 구문

Characters

Description

다음 문자를 특수 문자, 텍스트, 역참조 또는 8진수 이스케이프로 표시합니다. 예를 들어, "n"은 문자 "n"과 일치합니다. "n"은 개행 문자와 일치합니다. "\"matches"","("matches"(".

^

시퀀스는 입력 문자열의 시작 부분과 일치합니다. RegExp 개체의 Multiline 속성이 설정된 경우 ^ 또한 "n" 또는 "r"

$

이후의 위치와 일치합니다.

입력 문자열 끝의 위치와 일치합니다. RegExp 개체의 Multiline 속성이 설정된 경우 $는 "n" 또는 "r" 앞의 위치와도 일치합니다.

*

선행 문자 또는 하위 표현식을 0회 이상 일치시킵니다. 예를 들어 zo*는 "z" 및 "zoo"와 일치합니다. * {0,}와 동일합니다.

+

은 이전 문자 또는 하위 표현식과 한 번 이상 일치합니다. 예를 들어, "zo+"는 "zo" 및 "zoo"와 일치하지만 "z"와는 일치하지 않습니다. + {1,}과 동일합니다.

?

선행 문자 또는 하위 표현식을 0회 또는 1회 일치합니다. 예를 들어, "do(es)?"는 "does"의 "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}

Mn은 음수가 아닌 정수입니다. 여기서 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]"와 같은 패턴을 사용하십시오.

(pattern)

pattern과 일치하고 일치하는 하위 표현식을 캡처합니다. 캡처된 일치 항목은 $0…$9 속성을 사용하여 결과 "일치 항목" 컬렉션에서 검색할 수 있습니다. 대괄호 문자( )를 일치시키려면 "(" 또는 ")"를 사용하십시오.

(?:패턴)

pattern과 일치하지만 해당 일치의 하위 표현식을 캡처하지 않습니다. 즉, 비캡처 일치이며 나중에 사용하기 위해 일치를 저장하지 않습니다. 이는 패턴 부분을 "or" 문자(|)와 결합할 때 유용합니다. 예를 들어, 'industr(?:y|ies)는 'industry|industries'보다 더 경제적인 표현입니다.

(?=pattern)

pattern과 일치하는 문자열의 시작 부분에서 문자열과 일치하는 전방 예측 검색을 수행하는 하위 표현식입니다. 비캡처 일치, 즉 나중에 사용하기 위해 캡처할 수 없는 일치입니다. 예를 들어, 'Windows (?=95|98|NT|2000)'는 "Windows 2000"의 "Windows"와 일치하지만 "Windows 3.1"의 "Windows"와 일치하지 않습니다. 예측 미리보기는 문자를 차지하지 않습니다. 즉, 일치 항목이 발생한 후 예측 미리보기를 구성하는 문자 뒤가 아니라 이전 일치 항목 바로 다음에 다음 일치 항목이 검색됩니다.

(?!pattern)

pattern과 일치하는 문자열의 시작 부분에 없는 검색 문자열과 일치하는 역방향 탐색을 수행하는 하위 표현식입니다. 비캡처 일치, 즉 나중에 사용하기 위해 캡처할 수 없는 일치입니다. 예를 들어, 'Windows(?!95|98|NT|2000)'는 "Windows 3.1"의 "Windows"와 일치하지만 "Windows 2000"의 "Windows"와 일치하지 않습니다. 예측 미리보기는 문자를 차지하지 않습니다. 즉, 일치 항목이 발생한 후 예측 미리보기를 구성하는 문자 뒤가 아니라 이전 일치 항목 바로 다음에 다음 일치 항목이 검색됩니다.

x|y

x 또는 y과 일치합니다. 예를 들어 'z|food'는 "z" 또는 "food"와 일치합니다. '(z|f)ood'는 "zood" 또는 "food"와 일치합니다.

[xyz]

캐릭터 세트입니다. 에 포함된 모든 문자와 일치합니다. 예를 들어 "[abc]"는 "plain"의 "a"와 일치합니다.

[^xyz]

역방향 문자 집합입니다. 포함되지 않은 모든 문자와 일치합니다. 예를 들어, "[^abc]"는 "plain"의 "p", "l", "i" 및 "n"과 일치합니다.

[a-z]

문자 범위. 지정된 범위 내의 모든 문자와 일치합니다. 예를 들어, "[a-z]"는 "a"부터 "z"까지의 범위에 있는 모든 소문자와 일치합니다.

[^a-z]

역방향 문자. 지정된 범위 내에 없는 모든 문자와 일치합니다. 예를 들어, "[^a-z]"는 "a"에서 "z" 범위에 없는 모든 문자와 일치합니다.

b

단어 경계, 즉 단어와 공백 사이의 위치와 일치합니다. 예를 들어, "erb"는 "never"의 "er"와 일치하지만 "동사"의 "er"와는 일치하지 않습니다.

B

비단어 경계 일치. "erB"는 "동사"의 "er"와 일치하지만 "never"의 "er"와는 일치하지 않습니다.

cx

x로 표시된 제어 문자와 일치합니다. 예를 들어, cM은 Control-M 또는 캐리지 리턴과 일치합니다. x 값은 A-Z 또는 a-z 사이여야 합니다. 그렇지 않은 경우 c는 "c" 문자 자체로 간주됩니다.

d

숫자 문자 매칭. [0-9]와 동일합니다.

D

숫자가 아닌 문자 매칭. [^0-9]와 동일합니다.

f

폼 브레이크 매칭. x0c 및 cL과 동일합니다.

n

개행 일치. x0a 및 cJ와 동일합니다.

r

은 캐리지 리턴 문자와 일치합니다. x0d 및 cM과 동일합니다.

s

공백, 탭, 양식 피드 등을 포함한 모든 공백 문자와 일치합니다. [fnrtv]와 동일합니다.

S

은 공백이 아닌 모든 문자와 일치합니다. [^ fnrtv]와 동일합니다.

t

탭 매칭. x09 및 cI와 동일합니다.

v

세로 탭 일치. 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과 일치합니다. 여기서 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)인 경우 ml이 8진수(0-7)인 경우 8진수 이스케이프 코드 nml과 일치합니다. .

un

n과 일치합니다. 여기서 n은 4자리 16진수로 표시되는 유니코드 문자입니다. 예를 들어, u00A9는 저작권 기호(©)와 일치합니다.

Matcher 클래스의 메서드

Index 메서드

index 메서드는 입력 문자열에서 일치 항목이 발견된 위치를 정확하게 나타내는 유용한 인덱스 값을 제공합니다.

                        1
일련 번호 방법 및 설명
                  1public int start()
이전 일치 항목의 초기 인덱스를 반환합니다.
                2public int 시작(int 그룹)
이전 일치 작업 중에 지정된 그룹이 캡처한 하위 시퀀스의 초기 인덱스를 반환합니다.
                    3public int end()
마지막으로 일치하는 문자 뒤의 오프셋을 반환합니다.
                4public int end(int 그룹)
이전 일치 작업 중에 지정된 그룹이 캡처한 하위 시퀀스의 마지막 문자 뒤의 오프셋을 반환합니다. 연구 방법은 입력 문자열을 확인하고 패턴이 발견되는지 여부를 나타내는 부울 값을 반환하는 데 사용됩니다.
공개 부울 lookingAt()

영역의 시작 부분부터 시작하는 입력 시퀀스를 이 패턴과 일치시키려고 시도합니다.

                2 이 패턴과 일치하는 입력 시퀀스의 다음 하위 시퀀스를 찾아보세요.                 3                 4

교체 방법

교체 방법은 입력 문자열의 텍스트를 바꾸는 방법입니다.

공개 부울 find()
공개 부울 찾기(int start) 이 매처를 재설정하고 패턴과 일치하는 지정된 인덱스에서 시작하는 입력 시퀀스의 다음 하위 시퀀스를 찾으려고 시도합니다.
공개 부울 일치() 전체 영역을 패턴과 일치시키십시오.
일련번호방법 및 지침
                           1공용 일치자 추가 교체(StringBuffer sb, 문자열 교체)
비터미널 추가 및 교체 단계를 구현합니다.
                2공용 StringBuffer 추가Tail(StringBuffer sb)
터미널 추가 및 교체 단계를 구현합니다.
                3public String replacementAll(문자열 교체)
주어진 대체 문자열과 일치하는 입력 시퀀스의 각 하위 시퀀스에 대한 패턴을 바꿉니다.
                4공용 문자열 교체First(문자열 교체)
대체 패턴은 입력 시퀀스의 첫 번째 하위 시퀀스를 지정된 대체 문자열과 일치시킵니다.
                5public static String quoteReplacement(String s)
지정된 문자열에 대한 리터럴 대체 문자열을 반환합니다. 이 메서드는 Matcher 클래스의appendReplacement 메서드에 전달된 리터럴 문자열처럼 작동하는 문자열을 반환합니다.

start 및 end 방법

다음은 입력 문자열에 "cat"이라는 단어가 나타나는 횟수를 계산하는 예입니다.

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

public class RegexMatches
{
    private static final String REGEX = "\bcat\b";
    private static final String INPUT =
                                    "cat cat cat cattie cat";

    public static void main( String args[] ){
       Pattern p = Pattern.compile(REGEX);
       Matcher m = p.matcher(INPUT); // 获取 matcher 对象
       int count = 0;

       while(m.find()) {
         count++;
         System.out.println("Match number "+count);
         System.out.println("start(): "+m.start());
         System.out.println("end(): "+m.end());
      }
   }
}

위 예의 컴파일 및 실행 결과는 다음과 같습니다.

Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22

할 수 있습니다. 이 예에서는 문자 "c" "a" "t"가 단지 긴 단어의 하위 문자열이 아닌지 확인하기 위해 단어 경계를 사용합니다. 또한 입력 문자열에서 일치 항목이 발생한 위치에 대한 유용한 정보도 제공합니다.

Start 메서드는 이전 일치 작업 중에 해당 그룹이 캡처한 하위 시퀀스의 초기 인덱스를 반환하고, end 메서드는 마지막으로 일치하는 문자의 인덱스에 1을 추가합니다.

matches 및 lookingAt 메서드

matches 및 lookingAt 메서드는 모두 입력 시퀀스 패턴을 일치시키는 데 사용됩니다. 이들 사이의 차이점은 matcher는 전체 시퀀스가 ​​일치해야 하지만 lookingAt는 그렇지 않다는 것입니다.

이 두 가지 방법은 입력 문자열의 시작 부분에 자주 사용됩니다.

다음 예제를 사용하여 이 기능을 설명합니다.

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

public class RegexMatches
{
    private static final String REGEX = "foo";
    private static final String INPUT = "fooooooooooooooooo";
    private static Pattern pattern;
    private static Matcher matcher;

    public static void main( String args[] ){
       pattern = Pattern.compile(REGEX);
       matcher = pattern.matcher(INPUT);

       System.out.println("Current REGEX is: "+REGEX);
       System.out.println("Current INPUT is: "+INPUT);

       System.out.println("lookingAt(): "+matcher.lookingAt());
       System.out.println("matches(): "+matcher.matches());
   }
}

위 예제의 컴파일 및 실행 결과는 다음과 같습니다.

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false

replaceFirst 및 replacementAll 메서드

replaceFirst 및 replacementAll 메서드는 정규 표현식과 일치하는 텍스트를 바꾸는 데 사용됩니다. . 차이점은 replacementFirst는 첫 번째 일치 항목을 대체하고, replacementAll은 모든 일치 항목을 대체한다는 것입니다.

다음 예제에서는 이 기능을 설명합니다.

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

public class RegexMatches
{
    private static String REGEX = "dog";
    private static String INPUT = "The dog says meow. " +
                                    "All dogs say meow.";
    private static String REPLACE = "cat";

    public static void main(String[] args) {
       Pattern p = Pattern.compile(REGEX);
       // get a matcher object
       Matcher m = p.matcher(INPUT); 
       INPUT = m.replaceAll(REPLACE);
       System.out.println(INPUT);
   }
}

위 예제의 컴파일 및 실행 결과는 다음과 같습니다.

The cat says meow. All cats say meow.

appendReplacement 및appendTail 메서드

Matcher 클래스는 텍스트 교체를 위한appendReplacement 및appendTail 메서드도 제공합니다.

Look 다음 예에서 이 함수를 설명하십시오.

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

public class RegexMatches
{
   private static String REGEX = "a*b";
   private static String INPUT = "aabfooaabfooabfoob";
   private static String REPLACE = "-";
   public static void main(String[] args) {
      Pattern p = Pattern.compile(REGEX);
      // 获取 matcher 对象
      Matcher m = p.matcher(INPUT);
      StringBuffer sb = new StringBuffer();
      while(m.find()){
         m.appendReplacement(sb,REPLACE);
      }
      m.appendTail(sb);
      System.out.println(sb.toString());
   }
}

위 예의 컴파일 및 실행 결과는 다음과 같습니다.

-foo-foo-foo-

PatternSyntaxException 클래스의 메서드

PatternSyntaxException은 일반 구문 오류를 나타내는 비필수 예외 클래스입니다. 표현 패턴.

PatternSyntaxException 클래스는 어떤 오류가 발생했는지 확인하는 데 도움이 되는 다음 메서드를 제공합니다.

일련번호방법 및 지침
1공개 문자열 getDescription()
오류에 대한 설명을 가져옵니다.
                2public int getIndex()
잘못된 색인을 가져옵니다.
                3공개 문자열 getPattern()
잘못된 정규식 패턴을 가져옵니다.
                4공개 문자열 getMessage()
구문 오류 및 해당 인덱스에 대한 설명, 오류의 정규식 패턴 및 패턴의 오류 인덱스에 대한 시각적 표시가 포함된 여러 줄 문자열을 반환합니다.