Java 정규(1)-패턴 상세 설명(1)
18520 단어 정규 표현 식
Pattern
상세 설명;Matcher
상세 설명;다음은
Pattern
종 류 를 소개 합 니 다.자바 에서
java.util.regex
패 키 지 는 정규 표현 식 이 사용 하 는 관련 류 를 정 의 했 는데 그 중에서 가장 중요 한 두 가지 유형 은 Pattern
,Matcher
이다.Pattern
정규 표현 식 을 컴 파일 한 후 일치 하 는 모드 를 만 듭 니 다.Matcher
은 Pattern
인 스 턴 스 가 제공 하 는 정규 표현 식 을 사용 하여 대상 문자열 을 일치 시 키 는 것 이 검색 에 영향 을 주 는 대상 입 니 다.또 다른 예외 클래스 인 PatternSyntax Exception 은 불법 검색 모드 를 만 났 을 때 예 외 를 던 집 니 다.
패턴 개술
성명:public final class
Pattern
implements java.io.SerializablePattern 류 는
final
으로 장식 되 어 있 으 며,그 는 자 류 에 의 해 계승 되 지 못 한 다 는 것 을 알 수 있다.의미:패턴 클래스,정규 표현 식 의 컴 파일 표시 형식.
주의:이러한 인 스 턴 스 는 가 변 적 이지 않 습 니 다.여러 개의 병렬 스 레 드 를 안전하게 사용 할 수 있 습 니 다.
패턴 일치 모드(패턴 플래그)
copile()방법 은 정규 표현 식 의 일치 행 위 를 제어 하 는 인자 가 필요 합 니 다.
Pattern Pattern.compile(String regex, int flag)
flag 의 수치 범위
필드
설명 하 다.
Pattern.
UNIX_LINES
유 닉 스 줄 모드,대부분의 시스템 의 줄 은
으로 끝 납 니 다.그러나 일부 시스템,예 를 들 어 Windows 는 \r
조합 으로 끝 납 니 다.이 모드 를 사용 하면
만 줄 의 끝 문자 로 끝 납 니 다.이것 은^,$와 점(점 번호 가 줄 바 꿈 문자 와 일치)에 영향 을 줄 수 있 습 니 다. 끼 워 넣 는 플래그 표현 식(?d
)을 통 해서 도 유 닉 스 줄 모드 를 사용 할 수 있 습 니 다.Pattern.
CASE_INSENSITIVE
기본적으로 대소 문자 가 민감 하지 않 은 매 칭 은
US-ASCII
문자 집합 에 만 적 용 됩 니 다.이 표 지 는 표현 식 이 대소 문 자 를 무시 하고 일치 하도록 할 수 있 습 니 다.Unicode
문 자 를 크기 불명 감 에 맞 추 려 면 UNICODE_CASE
을 이 표지 와 합치 면 된다. 임 베 디 드 로고 표현 식(?i
)을 통 해 대소 문 자 를 구분 하지 않 는 일치 도 사용 할 수 있 습 니 다. 이 플래그 를 지정 하면 성능 에 영향 을 줄 수 있 습 니 다.Pattern.
COMMENTS
⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢⇢ 이 모드 에 서 는 일치 할 때 빈 칸 문자(표현 식 의'//s'가 아니 라 표현 식 의 빈 칸,tab,리 턴 등)와 주석(\#부터 이 줄 이 끝 날 때 까지)을 무시 합 니 다. 삽입 식 표지 표현 식(
?x
)을 통 해서 도 주석 모드 를 사용 할 수 있 습 니 다.Pattern.
MULTILINE
기본적으로 입력 한 문자열 은 한 줄 로 간주 되 며,이 줄 에 줄 바 꿈 자 를 싸 도 한 줄 로 간주 된다."^"에서"$"사이 의 내용 이 일치 할 때 전체 입력 은 한 줄 로 보 입 니 다.여러 줄 모드 를 사용 하면 줄 바 꿈 자 를 포함 하 는 입력 이 자동 으로 여러 줄 로 바 뀌 어 일치 합 니 다. 임 베 디 드 로고 표현 식(
?m
)을 통 해 여러 줄 모드 를 사용 할 수 있 습 니 다.Pattern.
LITERAL
글꼴 값 분석 모드 를 사용 합 니 다. 이 플래그 를 지정 하면 지정 한 패턴 의 입력 문자열 은 글자 액면가 문자 시퀀스 로 대 접 됩 니 다.입력 시퀀스 의 메타 문자 나 전의 시퀀스 는 특별한 의 미 를 가지 지 않 습 니 다. 표지
CASE_INSENSITIVE
과 UNICODE_CASE
은 이 표지 와 함께 사용 할 때 일치 하 는 데 영향 을 줄 것 입 니 다.다른 표지 들 은 모두 불필요 해 졌 다. 글자 의 액면가 해석 을 사용 할 수 있 는 삽입 식 표지 문자 가 존재 하지 않 습 니 다.Pattern.
DOTALL
이 모드 에서 표현 식
.
은 줄 끝 자 를 포함 하여 모든 문자 와 일치 할 수 있 습 니 다.기본적으로 이 표현 식 은 줄 끝 문자 와 일치 하지 않 습 니 다. 임 베 디 드 로고 표현 식(?s
)을 통 해 도 이 모드 를 사용 할 수 있 습 니 다.Pattern.
UNICODE_CASE
이 모드 에서
CASE_INSENSITIVE
플래그 를 사용 하면 유 니 코드 문 자 를 대소 문자 에 민감 하지 않 게 일치 합 니 다.기본적으로 대소 문자 불분명 감 의 일치 성 은 US-ASCI 문자 집합 에 만 적 용 됩 니 다. 이 플래그 를 지정 하면 성능 에 영향 을 줄 수 있 습 니 다.Pattern.
CANON_EQ
두 글자 의
(canonical decomposition)
이 똑 같은 경우 에 만 일치 하 는 것 으로 인정 된다.예 를 들 어 이 표 지 를 사용 한 후에 표현 식 a/u030A
은 ?
과 일치 합 니 다.기본 적 인 상황 에서 (canonical equivalence)
을 고려 하지 않 습 니 다. 이 플래그 를 지정 하면 성능 에 영향 을 줄 수 있 습 니 다.이런 표지 중에서
Pattern.CASE_INSENSITIVE
,Pattern.MULTILINE
,그리고 Pattern.COMMENTS
이 가장 유용 하 다(그 중에서 Pattern.COMMENTS
은 우리 가 생각 을 정리 하고/또는 문 서 를 만 드 는 데 도 도움 을 줄 수 있다).표현 식 에 기 호 를 꽂 는 방식 으로 절대 다수의 모드 를 사용 할 수 있 습 니 다.이 기호 들 은 바로 위의 그 시계의 각 표지 아래 에 있다.모드 가 시작 되 기 를 원 하 는 곳 에 기 호 를 꽂 으 세 요.OR
(|
)연산 자로 이 표지 들 을 배합 하여 사용 할 수 있다.코드 예제
다 중 모드:Pattern.
MULTILINE
예제테스트 해 봤 는데 MULTILINE 로고 가 없 으 면
^
과 $
은 입력 시퀀스 의 시작 과 끝 에 만 일치 할 수 있 습 니 다.그렇지 않 으 면 입력 시퀀스 내부 의 줄 끝 문자 와 일치 할 수 있 습 니 다.테스트 코드 는 다음 과 같 습 니 다:import java.util.regex.*;
/**
*
*/
public class ReFlags_MULTILINE {
public static void main(String[] args) {
//
String str = "hello world\r
" + "hello java\r
" + "hello java";
System.out.println("=========== ( )===========");
Pattern p = Pattern.compile("^hello");
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println(m.group() + " :[" + m.start() + "," + m.end() + "]");
}
System.out.println("=========== ( )===========");
p = Pattern.compile("^hello", Pattern.MULTILINE);
m = p.matcher(str);
while (m.find()) {
System.out.println(m.group() + " :[" + m.start() + "," + m.end() + "]");
}
System.out.println("=========== ( )===========");
p = Pattern.compile("java$");
m = p.matcher(str);
while (m.find()) {
System.out.println(m.group() + " :[" + m.start() + "," + m.end() + "]");
}
System.out.println("=========== ( )===========");
p = Pattern.compile("java$", Pattern.MULTILINE);
m = p.matcher(str);
while (m.find()) {
System.out.println(m.group() + " :[" + m.start() + "," + m.end() + "]");
}
}
}
=========== ( )===========
hello :[0,5]
=========== ( )===========
hello :[0,5]
hello :[13,18]
hello :[25,30]
=========== ( )===========
java :[31,35]
=========== ( )===========
java :[19,23]
java :[31,35]
대소 문자 무시:Pattern.
CASE_INSENSITIVE
예제대소 문자 의 일치 성 을 무시 해 야 할 때 도 있다.이 예 는 섭씨 온도 와 화 씨 온도 가 일치 하고 C,c,F 와 f 로 끝 나 는 온도 값 이 모두 일치 합 니 다.
import java.util.regex.Pattern;
public class ReFlags_CASE_INSENSITIVE {
public static void main(String[] args) {
System.out.println("===========API ===========");
String moneyRegex = "[+-]?(\\d)+(.(\\d)*)?(\\s)*[CF]";
Pattern p = Pattern.compile(moneyRegex,Pattern.CASE_INSENSITIVE);
System.out.println("-3.33c " + p.matcher("-3.33c").matches());
System.out.println("-3.33C " + p.matcher("-3.33C").matches());
System.out.println("=========== ===========");
moneyRegex = "[+-]?(\\d)+(.(\\d)*)?(\\s)*[CF]";
p = Pattern.compile(moneyRegex);
System.out.println("-3.33c " + p.matcher("-3.33c").matches());
System.out.println("-3.33C " + p.matcher("-3.33C").matches());
System.out.println("=========== ===========");
moneyRegex = "[+-]?(\\d)+(.(\\d)*)?(\\s)*(?i)[CF]";
p = Pattern.compile(moneyRegex);
System.out.println("-3.33c " + p.matcher("-3.33c").matches());
System.out.println("-3.33C " + p.matcher("-3.33C").matches());
System.out.println("=========== ===========");
moneyRegex = "[+-]?(\\d)+(.(\\d)*)?(\\s)*[CF]";
p = Pattern.compile(moneyRegex);
System.out.println("-3.33c " + p.matcher("-3.33c").matches());
System.out.println("-3.33C " + p.matcher("-3.33C").matches());
}
}
===========API ===========
-3.33c true
-3.33C true
=========== ===========
-3.33c false
-3.33C true
=========== ===========
-3.33c true
-3.33C true
=========== ===========
-3.33c false
-3.33C true
설명 사용 하기:Pattern.
COMMENTS
예제설명 을 사용 하면 정규 표현 식 의 빈 칸 과\#줄 이 무 시 됩 니 다.
import java.util.regex.Pattern;
public class ReFlags_COMMENTS {
public static void main(String[] args) {
System.out.println("===========API ===========");
String comments = " (\\d)+#this is comments.";
Pattern p = Pattern.compile(comments, Pattern.COMMENTS);
System.out.println("1234 " + p.matcher("1234").matches());
System.out.println("=========== ===========");
comments = " (\\d)+#this is comments.";
p = Pattern.compile(comments);
System.out.println("1234 " + p.matcher("1234").matches());
System.out.println("=========== ===========");
comments = "(?x) (\\d)+#this is comments.";
p = Pattern.compile(comments);
System.out.println("1234 " + p.matcher("1234").matches());
System.out.println("=========== ===========");
comments = " (\\d)+#this is comments.";
p = Pattern.compile(comments);
System.out.println("1234 " + p.matcher("1234").matches());
}
}
===========API ===========
1234 true
=========== ===========
1234 false
=========== ===========
1234 true
=========== ===========
1234 false
볼 수 있 습 니 다.\#줄 끝 에 있 는 주석 부분 과 앞의 공백 문 자 는 모두 무시 되 었 습 니 다.정규 표현 식 에 내 장 된 주석 사용 하기(?x)。
dotall 모드 사용 하기:Pattern.
DOTALL
예제dotall 모드 를 사용 합 니 다.일반적인 상황 에서 점(
.
)은 임의의 문자 와 일치 하지만 줄 바 꿈 문자 와 일치 하지 않 습 니 다.이 모드 를 사용 하면 점 수 는 줄 바 꿈 문자 와 일치 할 수 있 습 니 다.import java.util.regex.Pattern;
public class ReFlags_DOTALL {
public static void main(String[] args) {
System.out.println("===========API DOTALL===========");
String dotall = "(.)* ";
Pattern p = Pattern.compile(dotall, Pattern.DOTALL);
System.out.println("\\r\
" + p.matcher("\r
").matches());
System.out.println("=========== DOTALL===========");
dotall = "(.)* ";
p = Pattern.compile(dotall);
System.out.println("\\r\
" + p.matcher("\r
").matches());
System.out.println("=========== DOTALL===========");
dotall = "(?s)(.)* ";
p = Pattern.compile(dotall);
System.out.println("\\r\
" + p.matcher("\r
").matches());
System.out.println("=========== DOTALL===========");
dotall = "(.)* ";
p = Pattern.compile(dotall);
System.out.println("\\r\
" + p.matcher("\r
").matches());
}
}
===========API DOTALL===========
\r
true
=========== DOTALL===========
\r
false
=========== DOTALL===========
\r
true
=========== DOTALL===========
\r
false
문자 모드:Pattern.
LITERAL
예제이 모드 를 사용 하면 모든 메타 문자,전의 문 자 는 일반적인 문자 로 간주 되 고 다른 의 미 를 가지 지 않 습 니 다.
import java.util.regex.Pattern;
public class ReFlags_LITERAL {
public static void main(String[] args) {
System.out.println(Pattern.compile("\\d", Pattern.LITERAL).matcher("\\d").matches());// true
System.out.println(Pattern.compile("\\d", Pattern.LITERAL).matcher("2").matches());// false
System.out.println(Pattern.compile("(\\d)+", Pattern.LITERAL).matcher("1234").matches());// false
System.out.println(Pattern.compile("(\\d)+").matcher("1234").matches());// true
System.out.println(Pattern.compile("(\\d){2,3}", Pattern.LITERAL).matcher("(\\d){2,3}").matches());// true
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
awk 상용 명령awk 는 모든 입력 줄 을 하나의 기록 으로 인식 하고 그 줄 의 모든 단어 도 메 인 을 하나의 필드 로 인식 합 니 다. ARGC 명령 줄 에 awk 스 크 립 트 가 들 어 오 는 매개...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.