자바 정규 표현 식 에 정통 하 다

자바 정규 표현 식 에 정통 하 다
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);//
정규 표현 식 의 패턴 을 위주 로 합 니 다.
내용 이 한층 더 완벽 해 져 야 한다

좋은 웹페이지 즐겨찾기