캡처된 그룹 작업 방법
애플리케이션 소스 코드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
매치 포지션 결정 방법
이 클래스는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
.
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을 소개합니다.정규식 및 문서
전문 소프트웨어를 개발할 때 문서화는 필수 작업 중 하나입니다. 다행스럽게도 정규식은 문서 작성의 여러 측면에 도움이 될 수 있습니다. 목록 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.java
java ExtCmnt ExtCmnt.java out
// Следующий шаблон определяет многострочные комментарии,
// располагающиеся в одной строке (например, /* одна строка */)
// и однострочные комментарии (например, // Howая-то строка).
// Комментарий может располагаться в любом месте строки.
p = Pattern.compile(".*/\\*.*\\*/|.*//.*$");
if (m.matches()) /* Должна соответствовать вся строка */
패턴 string 에서 .*/\\*.*\\*/|.*//.*$
파이프 메타 문자는 |
논리 OR 연산자로 작동하여 일치자가 일치자 텍스트에서 일치 항목을 찾기 위해 지정된 정규식 구문의 왼쪽 피연산자를 사용해야 함을 나타냅니다. 일치하는 항목이 없으면 매처는 다른 검색 시도에 대해 지정된 정규식 구문의 오른쪽 피연산자를 사용합니다(캡처된 그룹의 괄호 메타 문자도 논리 연산자를 형성합니다). Java의 정규 표현식, 5부
GO TO FULL VERSION