JavaRush /Java Blog /Random-KO /Java의 정규 표현식, 1부

Java의 정규 표현식, 1부

Random-KO 그룹에 게시되었습니다
Jeff Friesen이 JavaWorld 웹사이트 를 위해 작성한 Java 언어의 정규식에 대한 간단한 가이드 번역을 알려드립니다 . 읽기 쉽도록 기사를 여러 부분으로 나누었습니다. Java의 정규 표현식, 1부 - 1

Java 프로그램에서 정규식 API를 사용하여 패턴 인식 및 설명

Java의 문자 및 다양한 문자열 데이터 유형은 패턴 일치에 대한 낮은 수준의 지원을 제공하지만 이러한 목적으로 사용하면 일반적으로 코드가 상당히 복잡해집니다. Regex API("정규식 API")를 사용하면 더 간단하고 성능이 뛰어난 코드를 얻을 수 있습니다. 이 튜토리얼은 정규식과 Regex API를 시작하는 데 도움이 됩니다. 먼저 일반적으로 패키지에서 가장 흥미로운 세 가지 클래스에 대해 논의한 java.util.regex다음 클래스 내부를 살펴보고 Pattern정교한 패턴 일치 구성을 탐색합니다. 주목: 여기에서 이 기사의 데모 애플리케이션 소스 코드(Jeff Friesen이 JavaWorld 사이트용으로 생성)를 다운로드할 수 있습니다 .

정규 표현식이란 무엇입니까?

정규식 (정규식/regex/regexp)은 특정 문자열 집합을 설명하는 패턴인 문자열입니다. 패턴은 세트에 속하는 행을 결정합니다. 패턴은 리터럴과 메타 문자(리터럴 의미가 아닌 특별한 의미를 갖는 문자)로 구성됩니다. 패턴 일치는 일치 항목, 즉 정규식 패턴과 일치하는 문자열을 찾기 위해 텍스트를 검색하는 것입니다. Java는 Regex API를 통해 패턴 일치를 지원합니다. 이 API는 패키지에 있는 Pattern, Matcher및 의 세 가지 클래스로 구성됩니다 . PatternSyntaxExceptionjava.util.regex
  • 템플릿이라고도 하는 클래스 객체는 Pattern컴파일된 정규식입니다.
  • 클래스 객체 Matcher또는 일치자는 문자 시퀀스(클래스가 인터페이스를 구현 java.lang.CharSequence하고 텍스트 소스 역할을 하는 객체)에서 일치하는 항목을 찾기 위한 패턴 해석 메커니즘입니다.
  • 클래스 개체는 PatternSyntaxException잘못된 정규식 패턴을 설명하는 데 사용됩니다.
Java는 또한 .NET Framework의 다양한 방법을 통해 패턴 일치를 지원합니다 java.lang.String. 예를 들어, 함수는 호출 문자열이 정규식과 정확하게 일치하는 경우에만 boolean matches (String regex)반환합니다 . trueregex
편리한 방법
matches()클래스의 기타 정규식 지향 편의 메서드는 StringRegex API와 유사한 방식으로 내부적으로 구현됩니다.

정규식데모

RegexDemoJava 정규식과 , 및 의 다양한 메서드를 보여주기 위해 Pattern애플리케이션 Matcher을 만들었습니다 PatternSyntaxException. 다음은 이 데모 애플리케이션의 소스 코드입니다. 목록 1. 정규식 데모
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class RegexDemo
{
   public static void main(String[] args)
   {
      if (args.length != 2)
      {
         System.err.println("usage: java RegexDemo regex input");
         return;
      }
      // Преобразуем символьные последовательности начала новой строки (\n) в символы начала строки.
      args[1] = args[1].replaceAll("\\\\n", "\n");
      try
      {
         System.out.println("regex = " + args[0]);
         System.out.println("input = " + args[1]);
         Pattern p = Pattern.compile(args[0]);
         Matcher m = p.matcher(args[1]);
         while (m.find())
            System.out.println("Found [" + m.group() + "] starting at "
                               + m.start() + " and ending at " + (m.end() - 1));
      }
      catch (PatternSyntaxException pse)
      {
         System.err.println("Неправильное регулярное выражение: " + pse.getMessage());
         System.err.println("Описание: " + pse.getDescription());
         System.err.println("Позиция: " + pse.getIndex());
         System.err.println("Неправильный шаблон: " + pse.getPattern());
      }
   }
}
main클래스 메소드가 가장 먼저 하는 일은 RegexDemo명령줄을 확인하는 것입니다. 여기에는 두 개의 인수가 필요합니다. 첫 번째는 정규식이고 두 번째는 정규식을 검색할 입력 텍스트입니다. 입력 텍스트 내에 개행 문자를 사용해야 할 수도 있습니다 (\n). \이는 문자 다음에 문자를 지정해야만 수행할 수 있습니다 n. 함수는 main()이 문자 시퀀스를 유니코드 값 10으로 변환합니다. Java의 정규 표현식, 1부 - 2코드의 대부분 RegexDemotry-catch. 블록은 try먼저 주어진 정규식과 입력 텍스트를 출력한 다음 Pattern컴파일된 정규식을 저장하는 객체를 생성합니다(정규식은 패턴 일치 성능을 향상시키기 위해 컴파일됩니다). 매처는 객체에서 추출되어 Pattern모든 항목이 발견될 때까지 반복적으로 일치 항목을 검색하는 데 사용됩니다. 블록은 예외에 대한 유용한 정보를 검색하기 위해 catch여러 클래스 메서드를 호출합니다 . PatternSyntaxException이 정보는 출력 스트림으로 순차적으로 출력됩니다. 코드가 어떻게 작동하는지 자세히 알 필요는 없습니다. 이 기사의 두 번째 부분에서 API를 연구하면 명확해질 것입니다. 그러나 목록 1을 컴파일해야 합니다. 목록 1의 코드를 가져온 후 명령 프롬프트에 다음 명령을 입력하여 컴파일합니다 RegexDemo. javac RegexDemo.java

Pattern 클래스 및 해당 구성

Regex API를 구성하는 세 가지 클래스 중 첫 번째 클래스인 클래스 Pattern는 정규식의 컴파일된 표현입니다. 클래스 SDK 문서에서는 Pattern다양한 정규식 구성을 설명하지만 정규식을 적극적으로 사용하지 않는 경우 이 문서의 일부가 혼란스러울 수 있습니다. 수량자는 무엇이며 탐욕, 꺼림, 소유 수량자의 차이점은 무엇입니까? 문자 클래스, 경계 일치자, 역참조 및 포함된 플래그 표현식이란 무엇입니까? 다음 섹션에서 이러한 질문과 기타 질문에 답변하겠습니다.

리터럴 문자열

가장 간단한 정규식 구성은 리터럴 문자열입니다. 패턴 일치가 성공하려면 입력 텍스트의 일부가 해당 구문의 패턴과 일치해야 합니다. 다음 예를 고려하십시오. 이 예에서는 입력 텍스트에서 java RegexDemo apple applet 패턴과 일치하는 항목을 찾으려고 합니다 . 다음 결과는 발견된 일치 항목을 보여줍니다. appleapplet
regex = apple
input = applet
Found [apple] starting at 0 and ending at 4
출력에서 정규식과 입력 텍스트를 확인한 다음 apple애플릿에서 성공적으로 감지되었음을 나타냅니다. 또한, 이 경기의 시작 및 종료 위치는 각각 0및 로 제공됩니다 4. 시작 위치는 일치 항목이 발견된 텍스트의 첫 번째 위치를 나타내고, 끝 위치는 일치 항목의 마지막 지점을 나타냅니다. 이제 다음 명령줄을 제공했다고 가정해 보겠습니다. java RegexDemo apple crabapple 이번에는 시작 위치와 끝 위치가 다른 다음과 같은 결과를 얻습니다.
regex = apple
input = crabapple
Found [apple] starting at 4 and ending at 8
그렇지 않으면 applet정규 표현식 apple(입력 텍스트)을 사용하면 일치하는 항목이 발견되지 않습니다. 정규식 전체가 일치해야 하지만 이 경우 입력 텍스트에 tafter가 포함되지 않습니다 apple. Java의 정규 표현식, 1부 - 3부

메타 문자

더 흥미로운 정규식 구성은 리터럴 문자와 메타문자를 결합합니다. 예를 들어 정규 표현식에서 a.b점 메타 문자는 와 b (.)사이의 모든 문자를 의미합니다 a. 다음 예를 고려하십시오. java RegexDemo .ox "The quick brown fox jumps over the lazy ox." 이 예 .ox에서는 정규식과 The quick brown fox jumps over the lazy ox.입력 텍스트를 모두 사용합니다. RegexDemo임의의 문자로 시작하고 다음으로 끝나는 일치 항목을 검색합니다. ox.실행 결과는 다음과 같습니다.
regex = .ox
input = The quick brown fox jumps over the lazy ox.
Found [fox] starting at 16 and ending at 18
Found [ ox] starting at 39 and ending at 41
출력에는 두 개의 일치 항목이 표시됩니다: foxand ox(앞에 공백 문자가 있음). 메타문자는 첫 번째 경우의 . 문자 f와 두 번째 경우의 공백과 일치합니다. .ox메타 문자로 바꾸면 어떻게 되나요 .? 즉, 다음 명령줄의 결과로 얻는 결과는 다음과 같습니다. java RegexDemo . "The quick brown fox jumps over the lazy ox." 점 메타 문자는 모든 문자와 일치하므로 RegexDemo입력 텍스트의 모든 문자(후행 점 문자 포함)에 대해 찾은 일치 항목을 출력합니다.
regex = .
input = The quick brown fox jumps over the lazy ox.
Found [T] starting at 0 and ending at 0
Found [h] starting at 1 and ending at 1
Found [e] starting at 2 and ending at 2
Found [ ] starting at 3 and ending at 3
Found [q] starting at 4 and ending at 4
Found [u] starting at 5 and ending at 5
Found [i] starting at 6 and ending at 6
Found [c] starting at 7 and ending at 7
Found [k] starting at 8 and ending at 8
Found [ ] starting at 9 and ending at 9
Found [b] starting at 10 and ending at 10
Found [r] starting at 11 and ending at 11
Found [o] starting at 12 and ending at 12
Found [w] starting at 13 and ending at 13
Found [n] starting at 14 and ending at 14
Found [ ] starting at 15 and ending at 15
Found [f] starting at 16 and ending at 16
Found [o] starting at 17 and ending at 17
Found [x] starting at 18 and ending at 18
Found [ ] starting at 19 and ending at 19
Found [j] starting at 20 and ending at 20
Found [u] starting at 21 and ending at 21
Found [m] starting at 22 and ending at 22
Found [p] starting at 23 and ending at 23
Found [s] starting at 24 and ending at 24
Found [ ] starting at 25 and ending at 25
Found [o] starting at 26 and ending at 26
Found [v] starting at 27 and ending at 27
Found [e] starting at 28 and ending at 28
Found [r] starting at 29 and ending at 29
Found [ ] starting at 30 and ending at 30
Found [t] starting at 31 and ending at 31
Found [h] starting at 32 and ending at 32
Found [e] starting at 33 and ending at 33
Found [ ] starting at 34 and ending at 34
Found [l] starting at 35 and ending at 35
Found [a] starting at 36 and ending at 36
Found [z] starting at 37 and ending at 37
Found [y] starting at 38 and ending at 38
Found [ ] starting at 39 and ending at 39
Found [o] starting at 40 and ending at 40
Found [x] starting at 41 and ending at 41
Found [.] starting at 42 and ending at 42
인용 메타문자
.정규식 구문에서 다른 메타 문자를 리터럴 문자로 지정하려면 다음 방법 중 하나로 해당 메타 문자를 이스케이프 처리해야 합니다.
  • 백슬래시 문자를 앞에 놓으십시오.
  • 이 메타문자를 \Q과 사이에 배치하세요 \E(예: \Q.\E).
String regex = "\\.";백슬래시(예: \\.또는 ) 와 같이 문자열 리터럴에 나타나는 모든 문자를 복제해야 합니다 \\Q.\\E. 명령줄 인수의 일부인 백슬래시를 복제하지 마십시오.

캐릭터 클래스

때로는 찾고 있는 일치 항목을 특정 문자 집합으로 제한해야 할 때도 있습니다. 예를 들어, 모음 a, e, 및 i에 대한 텍스트를 검색하고 모음 문자가 나타날 때마다 일치하는 것으로 간주됩니다. 이러한 문제를 해결하려면 대괄호( )의 메타 문자 사이에 문자 집합을 정의하는 문자 클래스가 도움이 될 것입니다. 이 클래스는 단순 문자 클래스, 범위 클래스, 역수, 합집합, 교차 및 빼기 클래스를 지원합니다. 이제 그것들을 모두 살펴보겠습니다. ou[ ]Pattern

간단한 문자 클래스

단순 문자 클래스는 나란히 배치된 문자로 구성되며 해당 문자만 일치합니다. 예를 들어 클래스는 [abc]문자 ab와 일치합니다 c. 다음 예를 고려하십시오. java RegexDemo [csw] cave 결과에서 볼 수 있듯이 이 예에서는 c일치하는 문자만 있습니다 cave.
regex = [csw]
input = cave
Found [c] starting at 0 and ending at 0

반전된 문자 클래스

반전된 문자 클래스는 메타 문자로 시작 ^하고 메타 문자에 포함되지 않은 문자만 일치합니다. 예를 들어 클래스는 , 및 를 [^abc]제외한 모든 문자와 일치 a합니다 . 다음 예를 고려하십시오. 내 운영 체제(Windows)에서는 쉘이 큰따옴표를 이스케이프 문자로 처리하므로 큰따옴표가 필요합니다. 보시다시피, 이 예에서는 , 및 wasfound 문자만 발견되었으며 , 이에 대한 일치 항목은 다음과 같습니다 . bcjava RegexDemo "[^csw]" cave^avecave
regex = [^csw]
input = cave
Found [a] starting at 1 and ending at 1
Found [v] starting at 2 and ending at 2
Found [e] starting at 3 and ending at 3

범위 문자 클래스

범위 문자 클래스는 하이픈( -)으로 구분된 두 문자로 구성됩니다. 하이픈 왼쪽 문자로 시작하고 오른쪽 문자로 끝나는 모든 문자는 범위의 일부입니다. 예를 들어 범위는 [a-z]모든 라틴 소문자와 일치합니다. 이는 간단한 클래스를 정의하는 것과 동일합니다 [abcdefghijklmnopqrstuvwxyz]. 다음 예를 고려하십시오. 이 예는 일치하는 java RegexDemo [a-c] clown 문자만 일치합니다 . cclown
regex = [a-c]
input = clown
Found [c] starting at 0 and ending at 0
Java 정규식, 2부 Java 정규식, 3부 Java 정규식, 4부 Java 정규식, 5부
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION