자바 정규 표현 식 에 정통 하 다
15959 단어 자바 정규 표현 식
1. 정규 표현 식 의 역할
정규 표현 식 은 거의 모든 문자열 작업 을 처리 할 수 있 습 니 다.
2. 정규 표현 식 의 기본 사용 (1)
1) 문자 그룹,
정규 표현 식 의 가장 기본 적 인 구조 중 하나 로 특정한 위치 에 나타 날 수 있 는 문 자 를 규정 합 니 다. [...] 괄호 안에 문 자 를 표시 합 니 다. 예 를 들 어:
String regex2 = "sep[ea]r[ea]te";
String str2 = "seperate";
2) 하이픈:
하이픈 범위 표시 표 법 사용 (설명 요약)
[0123456789] = [0-9]
[0-789] = [0-9]
[0123456789abcdef] = [0-9a-f]
메모: 문자 그룹의 내부 에 서 는 하이픈 이 두 문자 사이 에 나타 날 때 만 문자 의 범 위 를 표시 할 수 있 습 니 다. 문자 의 시작 에 나타 나 면 하이픈 자체 만 표시 할 수 있 습 니 다. "-"
3) 배제 형 문자 그룹
어떤 위치 에 나타 날 수 없 는 문 자 를 규정 하여 [ˆ…..]이 는 괄호 안에 나타 나 지 않 는 문자, 배제 형 문 자 를 규정 하고 있 습 니 다. 한 문자 와 일치 해 야 합 니 다. 빈 문자 와 일치 하지 않 습 니 다. 배제 형 문 자 는 하나의 연결 문자 나 여러 개의 연결 문 자 를 사용 할 수 있 습 니 다. 예 를 들 어:
"[^0-5]";
"[^0-5e-f]"
4) 문자 그룹 약기 법
자주 사용 하 는 문자 그룹 에 대해 정규 표현 식 은 해당 하 는 간단 한 표기 법 을 제공 하여 표시 하기 편리 합 니 다.
\d = [0-9]
\D = [ˆ0-9]
\w=[0-9a-z]
\W=[ˆ0-9a-z]
\s 공백 문자 일치 (리 턴, 줄 바 꾸 기, 탭, 빈 칸)
\S 공백 문자 일치
5) 특수 문자
점 호 를 찍다 “.” 거의 모든 문자 와 일치 하 는 특수 한 문자 그룹 약자 입 니 다. \. 점 호 자 체 를 나타 내 고 문자 그룹의 내부 [.] 에서 도 점 호 자체 만 일치 할 수 있 습 니 다. 주의: 정규 표현 식 의 규정 에 따라 점 호 는 줄 바 꿈 문자 와 일치 하지 않 습 니 다. (특징의 일치 모드 는 제외)
3. 정규 표현 식 의 기본 사용 (2)
1) 양사
이전 문자 출현 횟수 제한
* 이전 문자 가 0 번 에서 무한 번 나 타 났 습 니 다.
+ 이전 문자 최소 1 회 나타 나 기
? 이전 문 자 는 많아야 한 번 만 나타 날 수 있 습 니 다.
2) 구간 양사
문자 출현 횟수 를 정 하 다
형식:
{min,max}
{min,}
{number}
*={0,}
+={1,}
?={0,1}
3) 양사 의 한계
양 어 는 문자 나 문자 그룹 이 나타 나 는 횟수 만 규정 할 수 있 습 니 다. 문자열 이 나타 나 는 횟수 를 정 하려 면 사용 해 야 합 니 다 (...) ,괄호 안에 문자열 을 쓰 고 괄호 를 닫 은 후에 양 어 를 넣 습 니 다.
4) 괄호 의 용도: 다 중 선택 구조
문자 그룹 은 특정한 위치 에 나타 날 수 있 는 단자 문자 만 표시 할 수 있 을 뿐 특정한 위치 에 나타 날 문자열 은 표시 할 수 없습니다.
어떤 위치 에 나타 날 수 있 는 문자열 을 표시 합 니 다.
형식 은:
(….|…) ,세로 줄 양 끝 에 문자열 을 추가 합 니 다.
(….|….|…|)
실례: 숫자 를 미화 합 니 다. 코드 는 다음 과 같 습 니 다.
/**
* @param args
*/
public static void main(String[] args) {
String[] numbers = new String[] { "1234567890", "123456", "123" };
for (String number : numbers) {
System.out.print(number + " :" + beautifyNumber(number) + "");
System.out.println();
}
}
public static String beautifyNumber(String s) {
return s.replaceAll("(?<=\\d)(?=((\\d{3})+\\b))", ",");
}
결 과 는 다음 과 같다.
1234567890 :1,234,567,890
123456 :123,456
123 :123
여기 서 해석 을 하지 않 고 둘 러 보 는 것 을 배 운 후에 이 해 를 합 니 다.
5) 괄호 의 용도: 그룹 캡 처
역할: 괄호 안에 있 는 하위 표현 식 캡 처 문자열 을 일치 하 는 결과 에 저장 하여 일치 하 는 완료 후 접근 할 수 있 도록 합 니 다.
형식:
보통 괄호 사용 하기 (.....)
메모: 사용 하 는 괄호 만 있 으 면 그룹 이 존재 합 니 다. 캡 처 그룹 은 괄호 를 열 고 왼쪽 에서 오른쪽 순서 로 번 호 를 매 깁 니 다. 괄호 가 포 함 된 경우 도 마찬가지 입 니 다. 예 를 들 어:
표현 식 ((A)(B(C))) 네 개의 그룹 이 존재 합 니 다:
1
2
3
4
1 ((A)(B(C)))
2 /A
3 (B(C))
4 (C)
그룹 0 은 항상 전체 표현 식 을 대표 합 니 다.
그룹 을 캡 처 한 후 양사 가 존재 하면 결과 와 일치 합 니 다. 캡 처 그룹 은 하위 표현 식 의 마지막 일치 하 는 문자열 을 저장 합 니 다.
6) 캡 처 되 지 않 은 텍스트 의 괄호
표현 식 이 복잡 하거나 처리 해 야 할 텍스트 가 길 면 캡 처 그룹 이 효율 을 떨 어 뜨 립 니 다.
역할: 캡 처 된 텍스트 를 결 과 를 저장 하지 않 고 표현 식 으로 만 그룹 을 나 눕 니 다.
형식: (?:)
모든 언어 가 지원 되 는 것 이 아니 라 가 독성 이 좋 지 않 습 니 다. 효율 이 심각 한 문제 가 되면 텍스트 를 캡 처 하지 않 는 괄호 를 사용 하 는 것 을 고려 합 니 다.
7) 괄호 의 용도: 역방향 참조
표현 식 의 일부분 에서 이전 하위 표현 식 과 일치 하 는 텍스트 형식 을 동적 으로 반복 합 니 다: (\ 1)
4. 정규 표현 식 의 기본 사용 (3)
1) 닻 점
일치 하 는 위 치 를 규정 하 다.
형식: \ b 단어 분할 부호 닻 점
예 를 들 어 \ bcat \ b
주의사항: 1) 단어 분해 부 호 를 표시 합 니 다. 한쪽 은 단어 문자 이 고 다른 한쪽 은 비 단어 문자 입 니 다. 2) 단어 문자, 영문 문자, 숫자 문자, 중국어 에 적용 되 지 않 음; 3) 비 단어 문 자 는 각종 문장 부호 와 공백 문 자 를 가리킨다
예 를 들 면:
String[] strings = new String[] {
"This sentence contain word cat",
"This sentence contain word \"cat\"",
"This sentence contain word vacation",
"This sentence contain word \"cate\"",
" cat ",
" cat0",
};
String regex = "\\bcat\\b";
for(String str : strings) {
System.out.println("Checking sentence:\t" + str);
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
if(m.find()) {
System.out.println("Found word \"cat\"!");
}
else {
System.out.println("Can not found word \"cat\"!");
}
}
실행 결 과 는 다음 과 같 습 니 다.
Checking sentence: This sentence contain word cat
Found word "cat"!
Checking sentence: This sentence contain word "cat"
Found word "cat"!
Checking sentence: This sentence contain word vacation
Can not found word "cat"!
Checking sentence: This sentence contain word "cate"
Can not found word "cat"!
Checking sentence: cat
Can not found word "cat"!
Checking sentence: cat0
Can not found word "cat"!
ˆ(토 문자) 줄 머리 (서로 다른 일치 모드 에서 변 할 수 있 음)
$ 나타내다 행 의 끝 (서로 다른 일치 모드 에서 변 할 수 있 음)
\A 전체 문자열 의 시작 을 표시 합 니 다.
\Z 전체 문자열 의 끝 과 일치 합 니 다.
예제 코드 는 다음 과 같다.
String[] strings = new String[] { "start ", " start ", " end ", " end" };
String[] regexes = new String[] { "^start", "\\Astart", "end$", "end\\Z"};
for (String str : strings) {
for (String regex : regexes) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
if(m.find()) {
System.out.println("\"" + str
+ "\" can be matched with regex \"" + regex
+ "\"");
}
else {
System.out.println("\"" + str
+ "\" can not be matched with regex \"" + regex
+ "\"");
}
}
System.out.println("");
}
실행 결 과 는 다음 과 같 습 니 다.
"start " can be matched with regex "^start"
"start " can be matched with regex "\Astart"
"start " can not be matched with regex "end$"
"start " can not be matched with regex "end\Z"
" start " can not be matched with regex "^start"
" start " can not be matched with regex "\Astart"
" start " can not be matched with regex "end$"
" start " can not be matched with regex "end\Z"
" end " can not be matched with regex "^start"
" end " can not be matched with regex "\Astart"
" end " can not be matched with regex "end$"
" end " can not be matched with regex "end\Z"
" end" can not be matched with regex "^start"
" end" can not be matched with regex "\Astart"
" end" can be matched with regex "end$"
" end" can be matched with regex "end\Z"
2) 둘러보다
정박 점 의 위치 에 대한 판단 이 명확 하지 않다.
역할: 하위 표현 식 을 사용 하여 위 치 를 판단 합 니 다.
형식:
(? = 하위 표현 식) 오른쪽 텍스트 는 하위 표현 식 에서 일치 할 수 있 습 니 다.
(?! 하위 표현 식) 부정 순서 로 둘 러 보기, 오른쪽 텍스트 는 하위 표현 식 으로 일치 하지 않 습 니 다.
(? < 하위 표현 식) 역 주 행 을 확인 합 니 다. 왼쪽 텍스트 는 하위 표현 식 에서 일치 합 니 다.
(? 예 를 들 어 둘 러 보 겠 습 니 다.
String[] strings = new String[] { "Jeff", "Jeffrey", "Jefferson"};
String[] regexes = new String[] { "Jeff", "Jeff(?=rey)", "Jeff(?!rey)"};
for (String regex : regexes) {
for (String str : strings) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
if(m.find()) {
System.out.println("\"" + str
+ "\" can be matched with regex \"" + regex
+ "\"");
}
else {
System.out.println("\"" + str
+ "\" can not be matched with regex \"" + regex
+ "\"");
}
}
System.out.println("");
}
실행 결 과 는 다음 과 같 습 니 다.
"Jeff" can be matched with regex "Jeff"
"Jeffrey" can be matched with regex "Jeff"
"Jefferson" can be matched with regex "Jeff"
"Jeff" can not be matched with regex "Jeff(?=rey)"
"Jeffrey" can be matched with regex "Jeff(?=rey)"
"Jefferson" can not be matched with regex "Jeff(?=rey)"
"Jeff" can be matched with regex "Jeff(?!rey)"
"Jeffrey" can not be matched with regex "Jeff(?!rey)"
"Jefferson" can be matched with regex "Jeff(?!rey)"
부정 관찰:
String[] strings = new String[] {"see", "bee", "tee"};
String[] regexes = new String[] { "(?<=s)ee", "(?<!s)ee"};
for (String regex : regexes) {
for (String str : strings) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
if(m.find()) {
System.out.println("\"" + str
+ "\" can be matched with regex \"" + regex
+ "\"");
}
else {
System.out.println("\"" + str
+ "\" can not be matched with regex \"" + regex
+ "\"");
}
}
}
실행 결 과 는 다음 과 같 습 니 다.
"see" can be matched with regex "(?<=s)ee"
"bee" can not be matched with regex "(?<=s)ee"
"tee" can not be matched with regex "(?<=s)ee"
"see" can not be matched with regex "(?<!s)ee"
"bee" can be matched with regex "(?<!s)ee"
"tee" can be matched with regex "(?<!s)ee"
둘 러 보 는 사용 주의사항: 1) 순환 구 조 는 불 판단 에 만 사 용 됩 니 다. 구조 내 하위 표현 식 에 일치 하 는 텍스트 는 전체 표현 식 결과 에 저장 되 지 않 습 니 다. 2) 역순 환 시 구조 대 서브 표현 식 에 제한 이 있 습 니 다. 제한 은 다음 과 같 습 니 다.
Perl, Python: 역순 환 시 구조의 하위 표현 식 은 고정 길이 여야 합 니 다.
PHP,JAVA :역순 환 시 구조 에서 의 하위 표현 식 은 고정 길이 가 아 닐 수 있 지만, 반드시 상위 가 있어 야 하기 때문에 *, + 를 사용 할 수 없습니다. 이런 양사
.NET :역순 환 시 구조 에서 의 하위 표현 식 가능 전혀 제한 이 없다.
둘 러 보 는 학습 을 통 해 위의 예 에서 123456789 를 123, 456, 789 의 정규 표현 식 으로 바 꾸 었 다 는 것 을 완전히 이해 할 수 있다.
5. 정규 표현 식 의 기본 사용 (4)
1) 일치 모드
역할: 일부 구조의 일치 규칙 변경
형식:
I: Case Insensitive
S: SingleLine(dot All)
M: MultiLine
X: Comment
2) 대소 문자 구분 없 음
String regex = "ABC";
Pattern p = Pattern.compile(regex,Pattern.CASE_INSENSITIVE)
String str = "abc";
String regex = "ABC";
Pattern p = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);//
Matcher m = p.matcher(str);
if(m.find()) {
System.out.println("\"" + str
+ "\" can be matched with regex \"" + regex
+ "\"");
} else {
System.out.println("\"" + str
+ "\" can not be matched with regex \"" + regex
+ "\"");
}
실행 결 과 는 다음 과 같 습 니 다.
쓰다
"abc" can be matched with regex "ABC"
3) 단일 모드 (점호 연결 모드)
String regex = "]+)>.*";
Pattern p = Pattern.compile(regex,Pattern.DOTALL);//
기본 적 인 상황 에서 점 호 를 누 르 면 줄 을 바 꿀 수 없 지만 상기 모드 에서 점 호 를 사용 하면 줄 을 바 꿀 수 있 습 니 다.
String str = "<a href=www.itcast.net>
ITCAST
</a>";
String regex = "<a href=([^>]+)>.*</a>";
Pattern p = Pattern.compile(regex);//
Matcher m = p.matcher(str);
if(m.find()) {
System.out.println("\"" + str
+ "\" can be matched with regex \"" + regex
+ "\"");
} else {
System.out.println("\"" + str
+ "\" can not be matched with regex \"" + regex
+ "\"");
}
실행 결 과 는 다음 과 같 습 니 다.
"<a href=www.itcast.net>
ITCAST
</a>" can not be matched with regex "<a href=([^>]+)>.*</a>"
4) 다 중 모드
수정 하 다ˆ(토 문자) $일치 모드, 문자열 내부 각 줄 의 시작 과 끝 위치 와 일치 할 수 있 습 니 다.
\A Z 와 영향 을 받 지 않다
String regex = "^ITCAST$";
Pattern p = Pattern.compile(regex,Pattern.MULTILINE);//
String str = "<a href=www.itcast.net>
ITCAST
</a>";
String regex = "^ITCAST$";
Pattern p = Pattern.compile(regex,Pattern.MULTILINE);//
Matcher m = p.matcher(str);
if (m.find()) {
System.out.println("\"" + str + "\" can be matched with regex \""
+ regex + "\"");
} else {
System.out.println("\"" + str
+ "\" can not be matched with regex \"" + regex + "\"");
}
실행 결 과 는 다음 과 같 습 니 다.
"<a href=www.itcast.net>
ITCAST
</a>" can be matched with regex "^ITCAST$"
5) 주석 모드
역할: 정규 표현 식 내부 에 주석 을 사용 할 수 있 도록 주석 모드 를 사용 합 니 다.
설명 은 \ # 로 시작 하여 줄 바 꿈 문자 로 끝 납 니 다 (또는 표현 식 이 끝 날 때 까지)
이 모드 를 사용 하면 정규 표현 식 은 모든 공백 문 자 를 무시 합 니 다.
String str = "[email protected]";
String regex = "webmaster #username
" + "@" + "itcast.net #hostname";
Pattern p = Pattern.compile(regex, Pattern.COMMENTS);//
Matcher m = p.matcher(str);
if (m.find()) {
System.out.println("\"" + str + "\" can be matched with regex \""
+ regex + "\"");
} else {
System.out.println("\"" + str
+ "\" can not be matched with regex \"" + regex + "\"");
}
실행 결 과 는 다음 과 같 습 니 다.
"<a href=www.itcast.net>
ITCAST
</a>" can be matched with regex "^ITCAST$"
6) 혼합 모드
역할: 여러 모드 동시 사용
형식: 정규 표현 식 을 컴 파일 할 때 모드 를 나타 내 는 여러 매개 변 수 를 세로 로 합 니 다. | ” 잇다
String regex = "]+)>.*";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
7) 패턴 의 작용 범위
역할: 정확 한 제어 모델 의 역할 범위
형식: 표현 식 에서 (? ismx) 모드 를 사용 합 니 다. (? - ismx) 방식 으로 모드 를 사용 하지 않 습 니 다.
예:
String regex = "(?is)]+)>.*"; i 와 s 사용 하기 패턴
8) 패턴 충돌
String regex = "(?-i)ABC";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);//
정규 표현 식 의 패턴 을 위주 로 합 니 다.
내용 이 한층 더 완벽 해 져 야 한다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 정규 표현 식 (1)문자열 을 처리 하 는 프로그램 이나 웹 페이지 를 작성 할 때 복잡 한 규칙 에 맞 는 문자열 을 찾 을 필요 가 있 습 니 다.정규 표현 식 은 이 규칙 들 을 설명 하 는 도구 입 니 다.정규 표현 식 은 텍스...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.