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

Java의 정규 표현식, 4부

Random-KO 그룹에 게시되었습니다
우리는 Javaworld 웹사이트 를 위해 Jeff Friesen이 작성한 Java 정규식에 대한 짧은 가이드의 번역을 여러분의 주의에 제시합니다 . 읽기 쉽도록 기사를 여러 부분으로 나누었습니다. Java의 정규 표현식, 4부 - 1 Java 정규식, 1부 Java 정규식, 2부 Java 정규식, 3부

캡처된 그룹 작업 방법

애플리케이션 소스 코드 RegexDemo에는 메소드 호출이 포함되어 있습니다 m.group(). 이 메서드는 캡처된 그룹 작업을 목표로 하는 group()클래스의 여러 메서드 중 하나입니다 .Matcher
  • 이 메서드는 int groupCount()확인자 패턴에서 캡처된 그룹 수를 반환합니다. 이 숫자는 패턴 전체에 해당하는 특수 캡처 그룹 번호 0을 고려하지 않습니다.

  • 이 메서드는 String group()발견된 이전 일치 항목의 문자를 반환합니다. 빈 문자열에 대한 성공적인 검색을 보고하기 위해 이 메서드는 빈 문자열을 반환합니다. 해석기가 아직 조회를 수행하지 않았거나 이전 조회 작업이 실패한 경우 예외가 발생합니다 IllegalStateException.

  • 이 메서드는 String group(int group)매개변수로 지정된 그룹 번호로 캡처된 이전 일치 문자를 반환한다는 점을 제외하면 이전 메서드와 유사합니다 group. 이는 와 group(0)동일합니다 group(). 템플릿에 지정된 번호의 캡처된 그룹이 없으면 메서드에서 예외가 발생합니다 IndexOutOfBoundsException. 해석기가 아직 조회를 수행하지 않았거나 이전 조회 작업이 실패한 경우 예외가 발생합니다 IllegalStateException.

  • 이 메서드는 String group(String name)이름 그룹에서 캡처한 이전 일치 항목의 문자를 반환합니다. 캡처된 그룹 이름이 템플릿에 없으면 예외가 발생합니다 IllegalArgumentException. 해석기가 아직 조회를 수행하지 않았거나 이전 조회 작업이 실패한 경우 예외가 발생합니다 IllegalStateException.

다음 예에서는 groupCount()및 메서드의 사용을 보여줍니다 group(int group).
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abc");
m.find();
System.out.println(m.groupCount());
for (int i = 0; i <= m.groupCount(); i++)
System.out.println(i + ": " + m.group(i));
실행 결과:
3
0: abc
1: abc
2: bc
3: c
Java의 정규 표현식, 4부 - 2

매치 포지션 결정 방법

이 클래스는 Matcher일치 항목의 시작 및 끝 위치를 반환하는 여러 메서드를 제공합니다.
  • 이 메서드는 int start()발견된 이전 일치 항목의 시작 위치를 반환합니다. 해석기가 아직 조회를 수행하지 않았거나 이전 조회 작업이 실패한 경우 예외가 발생합니다 IllegalStateException.

  • 이 방법은 int start(int group)이전 방법과 유사하지만 매개변수에 지정된 번호의 그룹에 대해 찾은 이전 일치 항목의 시작 위치를 반환합니다 group. 템플릿에 지정된 번호의 캡처된 그룹이 없으면 메서드에서 예외가 발생합니다 IndexOutOfBoundsException. 해석기가 아직 조회를 수행하지 않았거나 이전 조회 작업이 실패한 경우 예외가 발생합니다 IllegalStateException.

  • 이 메서드는 int start(String name)이전 메서드와 유사하지만 호출된 그룹에 대해 찾은 이전 일치 항목의 시작 위치를 반환합니다 name. 캡처된 그룹이 name템플릿에 없으면 예외가 발생합니다 IllegalArgumentException. 해석기가 아직 조회를 수행하지 않았거나 이전 조회 작업이 실패한 경우 예외가 발생합니다 IllegalStateException.

  • 이 메서드는 int end()발견된 이전 일치 항목의 마지막 문자 위치에 1을 더한 값을 반환합니다. 일치 프로그램이 아직 일치 항목을 수행하지 않았거나 이전 검색 작업이 실패한 경우 예외가 발생합니다 IllegalStateException.

  • 이 방법은 int end(int group)이전 방법과 유사하지만 매개변수에 의해 번호가 지정된 그룹에 대해 찾은 이전 일치 항목의 끝 위치를 반환합니다 group. 템플릿에 지정된 번호의 캡처된 그룹이 없으면 메서드에서 예외가 발생합니다 IndexOutOfBoundsException. 해석기가 아직 조회를 수행하지 않았거나 이전 조회 작업이 실패한 경우 예외가 발생합니다 IllegalStateException.

  • 이 메서드는 int end(String name)이전 메서드와 유사하지만 호출된 그룹에 대해 찾은 이전 일치 항목의 끝 위치를 반환합니다 name. 캡처된 그룹이 name템플릿에 없으면 예외가 발생합니다 IllegalArgumentException. 해석기가 아직 조회를 수행하지 않았거나 이전 조회 작업이 실패한 경우 예외가 발생합니다 IllegalStateException.

다음 예에서는 캡처 그룹 번호 2에 대한 시작/끝 일치 위치를 출력하는 두 가지 일치 위치 메서드를 보여줍니다.
Pattern p = Pattern.compile("(.(.(.)))");
Matcher m = p.matcher("abcabcabc");
while (m.find())
{
   System.out.println("Найдено " + m.group(2));
   System.out.println("  начинается с позиции " + m.start(2) +
                      " и заканчивается на позиции " + (m.end(2) - 1));
   System.out.println();
}
이 예제의 출력은 다음과 같습니다.
Найдено bc
начинается с позиции 1 и заканчивается на позиции 2
Найдено bc
начинается с позиции 4 и заканчивается на позиции 5
Найдено bc
начинается с позиции 7 и заканчивается на позиции 8

PatternSyntaxException 클래스의 메서드

클래스의 인스턴스가 PatternSyntaxException정규식의 구문 오류를 설명합니다. 메소드 compile()matches()클래스 에서 이러한 예외를 발생시키며 Pattern다음 생성자를 통해 구성됩니다. PatternSyntaxException(String desc, String regex, int index) 이 생성자는 지정된 설명( desc), 정규식 ( regex) 및 구문 오류가 발생한 위치를 저장합니다. 구문 오류 위치를 알 수 없으면 값이 index로 설정됩니다 -1. 대부분의 경우 PatternSyntaxException. 그러나 형식화된 오류 메시지를 생성할 때는 위의 값을 추출해야 합니다. 이렇게 하려면 다음 방법을 사용할 수 있습니다.
  • 이 메서드는 String getDescription()구문 오류에 대한 설명을 반환합니다.
  • 이 메서드는 int getIndex()오류가 발생한 위치를 반환하거나 위치를 알 수 없는 경우 -1을 반환합니다.
  • 메서드가 String getPattern()잘못된 정규식을 반환합니다.
또한 상속된 메서드는 String getMessage()템플릿에서 구문 오류가 발생한 위치에 대한 시각적 표시와 함께 이전 메서드에서 반환된 값이 포함된 여러 줄 문자열을 반환합니다. 구문 오류란 무엇입니까? 예는 다음과 같습니다. java RegexDemo (?itree Treehouse 이 경우 )중첩된 플래그 표현식에 닫는 괄호 메타 문자( )를 지정하는 것을 잊었습니다. 이 오류의 출력 내용은 다음과 같습니다.
regex = (?itree
input = Treehouse
Неправильное регулярное выражение: Unknown inline modifier near index 3
(?itree
   ^
Описание: Unknown inline modifier
Позиция: 3
Неправильный шаблон: (?itree

Regex API를 사용하여 유용한 정규식 애플리케이션 구축

정규식을 사용하면 강력한 텍스트 처리 애플리케이션을 만들 수 있습니다. 이 섹션에서는 Regex API 클래스 및 메서드를 더 자세히 탐색할 수 있도록 도와주는 두 가지 편리한 애플리케이션을 보여 드리겠습니다. 두 번째 부록에서는 어휘 분석을 수행하기 위한 재사용 가능한 코드 라이브러리인 Lexan을 소개합니다. Java의 정규 표현식, 4부 - 3

정규식 및 문서

전문 소프트웨어를 개발할 때 문서화는 필수 작업 중 하나입니다. 다행스럽게도 정규식은 문서 작성의 여러 측면에 도움이 될 수 있습니다. 목록 1의 코드는 소스 파일에서 한 줄과 여러 줄의 C 스타일 주석이 포함된 줄을 추출하여 다른 파일에 씁니다. 코드가 작동하려면 주석이 같은 줄에 있어야 합니다. 목록 1. 댓글 검색하기
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

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

public class ExtCmnt
{
   public static void main(String[] args)
   {
      if (args.length != 2)
      {
         System.err.println("Способ применения: java ExtCmnt infile outfile");
         return;
      }

      Pattern p;
      try
      {
         // Следующий шаблон определяет многострочные комментарии,
         // располагающиеся в одной строке (например, /* одна строка */)
            // и однострочные комментарии (например, // Howая-то строка).
            // Комментарий может располагаться в любом месте строки.

         p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
      }
      catch (PatternSyntaxException pse)
      {
         System.err.printf("Синтаксическая ошибка в регулярном выражении: %s%n", pse.getMessage());
         System.err.printf("Описание ошибки: %s%n", pse.getDescription());
         System.err.printf("Позиция ошибки: %s%n", pse.getIndex());
         System.err.printf("Ошибочный шаблон: %s%n", pse.getPattern());
         return;
      }

      try (FileReader fr = new FileReader(args[0]);
           BufferedReader br = new BufferedReader(fr);
           FileWriter fw = new FileWriter(args[1]);
           BufferedWriter bw = new BufferedWriter(fw))
      {
         Matcher m = p.matcher("");
         String line;
         while ((line = br.readLine()) != null)
         {
            m.reset(line);
            if (m.matches()) /* Должна соответствовать вся строка */
            {
               bw.write(line);
               bw.newLine();
            }
         }
      }
      catch (IOException ioe)
      {
         System.err.println(ioe.getMessage());
         return;
      }
   }
}
목록 1의 메서드는 main()먼저 올바른 명령줄 구문을 확인한 다음 단일 및 여러 줄 주석을 감지하도록 설계된 정규식을 클래스 객체로 컴파일합니다 Pattern. 예외가 발생하지 않으면 PatternSyntaxException메서드는 main()소스 파일을 열고, 대상 파일을 생성하고, 읽은 각 줄을 패턴과 일치시키는 일치자를 얻은 다음, 소스 파일을 한 줄씩 읽습니다. 각 줄마다 주석 패턴과 일치됩니다. 성공하면 메소드는 main()문자열(뒤에 줄 바꿈)을 대상 파일에 씁니다(향후 Java 101 튜토리얼에서 파일 I/O 논리를 다룰 것입니다). 다음과 같이 목록 1을 컴파일합니다. 파일을 입력으로 javac ExtCmnt.java 사용하여 애플리케이션을 실행합니다 . 파일 출력에서 ​​다음 결과를 얻어야 합니다. ExtCmnt.javajava ExtCmnt ExtCmnt.java out
// Следующий шаблон определяет многострочные комментарии,
 // располагающиеся в одной строке (например, /* одна строка */)
    // и однострочные комментарии (например, // Howая-то строка).
    // Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
    if (m.matches()) /* Должна соответствовать вся строка */
패턴 string 에서 .*/\\*.*\\*/|.*//.*$파이프 메타 문자는 |논리 OR 연산자로 작동하여 일치자가 일치자 텍스트에서 일치 항목을 찾기 위해 지정된 정규식 구문의 왼쪽 피연산자를 사용해야 함을 나타냅니다. 일치하는 항목이 없으면 매처는 다른 검색 시도에 대해 지정된 정규식 구문의 오른쪽 피연산자를 사용합니다(캡처된 그룹의 괄호 메타 문자도 논리 연산자를 형성합니다). Java의 정규 표현식, 5부
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION