정규 표현 식 학습 4 일 째
패 킷
우 리 는 단일 문 자 를 어떻게 반복 하 는 지 이미 언급 했다.하지만 여러 글 자 를 반복 하려 면 어떻게 해 야 합 니까?하위 표현 식 (그룹 이 라 고도 함) 을 작은 괄호 로 지정 할 수 있 습 니 다. 그리고 이 하위 표현 식 의 중복 횟수 를 지정 할 수 있 습 니 다. 하위 표현 식 에 대해 다른 작업 을 할 수도 있 습 니 다. (나중에 소개 할 것 입 니 다)
(/ d {1, 3} /.) {3} / d {1, 3} 은 간단 한 IP 주소 일치 식 입 니 다.이 표현 식 을 이해 하려 면 다음 순서 로 분석 하 십시오.
불 행 히 도 256.300.888.999 라 는 존재 할 수 없 는 IP 주소 와 일치 합 니 다.. 산술 비 교 를 사용 할 수 있다 면 이 문 제 를 간단하게 해결 할 수 있 을 것 입 니 다. 그러나 정규 표현 식 에 서 는 수학 에 관 한 어떠한 기능 도 제공 하지 않 기 때문에 지루 한 그룹 을 나 누 어 선택 할 수 있 습 니 다. 문자 류 를 사용 하여 정확 한 IP 주 소 를 설명 할 수 있 습 니 다. (2 [0 - 4] / d | 25 [0 - 5] | [0 - 1]? / d / d?) {3} (2 [0 - 4] / d | 25 [0 - 5] | [01]? / d?)
이 표현 식 을 이해 하 는 관건 은 2 [0 - 4] / d | 25 [0 - 5] | [01]? / d? 를 이해 하 는 것 이다. 여기 서 나 는 자세히 말 하지 않 겠 다. 너 자신 이 그 의 미 를 분석 할 수 있 을 것 이다.
후방 참조
작은 괄호 로 하위 표현 식 을 지정 한 후 이 하위 표현 식 과 일치 하 는 텍스트 (즉, 이 그룹 에서 캡 처 한 내용)표현 식 이나 다른 프로그램 에서 진일보 한 처 리 를 할 수 있 습 니 다. 기본 적 인 상황 에서 각 그룹 은 자동 으로 하나의 그룹 번 호 를 가지 고 있 습 니 다. 규칙 은 왼쪽 에서 오른쪽으로 그룹의 왼쪽 괄호 를 표시 합 니 다. 첫 번 째 로 나타 난 그룹의 그룹 번 호 는 1 이 고 두 번 째 는 2 입 니 다.
다음 인용 은 앞의 그룹 과 일치 하 는 텍스트 를 중복 검색 하 는 데 사 용 됩 니 다. 예 를 들 어 / 1 은 그룹 1 과 일치 하 는 텍스트 를 대표 합 니 다. 이해 하기 어렵 습 니까? 예제 를 보십시오.
/ b (/ w +) / b / s + / 1 / b 는 중복 되 는 단어, 예 를 들 어 go, kitty kitty 와 일치 할 수 있 습 니 다. 먼저 단어 시작 부분 과 끝 부분 사이 에 하나 이상 의 알파벳 이나 숫자 (/ b (/ w +) / b), 그 다음 에 1 개 또는 몇 개의 공백 문자 (/ s +), 마지막 으로 앞 에 일치 하 는 단어 (/ 1) 입 니 다.
하위 표현 식 의 그룹 이름 도 지정 할 수 있 습 니 다. 하위 표현 식 의 그룹 이름 을 지정 하려 면 다음 문법 을 사용 하 십시오./b/s+/k
작은 괄호 를 사용 할 때 도 특정한 용도 의 문법 이 많 습 니 다. 다음은 가장 많이 사용 되 는 문법 을 보 여 줍 니 다.
표 4. 그룹 문법
포획 하 다.
(exp)
exp 와 일치 하고 자동 으로 이름 이 붙 은 그룹 에 텍스트 를 캡 처 합 니 다.
(?
exp 와 일치 하고 이름 이 name 인 그룹 에 텍스트 를 캡 처 할 수도 있 습 니 다. (? 'name' exp)
(?:exp)
exp 와 일치 합 니 다. 일치 하 는 텍스트 를 캡 처 하지 않 고 이 그룹 에 그룹 번 호 를 할당 하지 않 습 니 다.
너그러이 단언 하 다
(?=exp)
exp 앞 위치 일치
(?<=exp)
exp 뒤의 위치 와 일치 합 니 다.
(?!exp)
뒤에 있 는 것 과 일치 하 는 것 은 exp 의 위치 가 아 닙 니 다.
(?앞 에 exp 가 아 닌 위치 와 일치 합 니 다.
주석
(?#comment)
이러한 유형의 그룹 은 정규 표현 식 의 처리 에 영향 을 주지 않 고 주석 을 제공 하여 읽 게 합 니 다.
우 리 는 이미 앞의 두 가지 문법 에 대해 토론 했다. 세 번 째 (?: exp) 는 정규 표현 식 의 처리 방식 을 바 꾸 지 않 을 것 이다. 다만 이러한 그룹 이 일치 하 는 내용 은 앞의 두 가지 처럼 특정한 그룹 에 포착 되 지 않 을 것 이다.
너그러이 단언 하 다
다음 네 가 지 는 어떤 내용 (그러나 이러한 내용 은 포함 되 지 않 음) 이전 이나 그 후의 것 을 찾 는 데 사 용 됩 니 다. 즉, / b, ^, $처럼 위 치 를 지정 하 는 데 사 용 됩 니 다. 이 위 치 는 일정한 조건 (단언) 을 만족 시 켜 야 하기 때문에 0 폭 단언 이 라 고도 부 릅 니 다. 예 를 들 어 설명 하 는 것 이 좋 습 니 다.
(? = exp) 는 0 너비 로 선행 단언 을 예측 하고 있 습 니 다. 자신 이 나타 난 위치 뒤에 표현 식 exp 가 일치 할 것 이 라 고 단언 합 니 다. 예 를 들 어 / b / w + (? = ing / b) 는 ing 으로 끝 나 는 단어의 앞부분 (ing 을 제외 한 부분) 과 일치 합 니 다. 예 를 들 어 I 'm singing while you' re dancing 을 찾 을 때 sing 과 danc 가 일치 합 니 다.
(? < = exp) 는 0 너비 라 고도 합 니 다. 돌 이 켜 보고 단언 합 니 다. 자신 이 나타 난 위치 앞 에 표현 식 exp 가 일치 할 수 있다 고 단언 합 니 다. 예 를 들 어 (? < = / bre) / w + / b 는 re 로 시작 하 는 단어의 후반 부 (re 를 제외 한 부분) 와 일치 합 니 다. 예 를 들 어 reading a book 을 찾 을 때 ading 과 일치 합 니 다.
긴 숫자 에 세 자리 마다 쉼표 를 추가 하려 면 (당연히 오른쪽 에서 추가 되 었 습 니 다) 앞 과 안에 쉼표 를 추가 해 야 할 부분 을 찾 아 보 세 요. (? < = / d) / d {3}) * / b. 1234567890 을 찾 았 을 때 결 과 는 234567890 입 니 다.
아래 의 이 예 는 이 두 가지 단언 을 동시에 사용 했다. (? < = / s) / d + (? = / s) 공백 문자 로 간격 을 두 는 숫자 와 일치 합 니 다. (다시 한 번 강조 하지만 이 공백 문 자 는 포함 되 지 않 습 니 다.)
마이너스 제로 폭 의 단언
앞에서 우 리 는 어떤 문자 가 아 닌 문자 나 특정한 문자 류 에 없 는 문 자 를 어떻게 찾 는 지 에 대해 언급 한 적 이 있 습 니 다. 그러나 우리 가 특정한 문자 가 나타 나 지 않 았 는 지 확인 하고 싶 을 뿐 일치 하고 싶 지 않 을 때 어떻게 합 니까? 예 를 들 어, 우리 가 이러한 단 어 를 찾 고 싶다 면, 그 안에 알파벳 q 가 나 타 났 습 니 다. 그러나 q 뒤 에는 알파벳 u 가 아 닙 니 다. 우 리 는 이렇게 시도 할 수 있 습 니 다.
/ b / w * q [^ u] / w * / b 는 알파벳 u 가 아 닌 알파벳 q 를 포함 하 는 단어 와 일치 합 니 다. 하지만 테스트 를 많이 하면 (또는 생각 이 예민 해서 직접 관찰 할 수 있 습 니 다) q 가 단어의 끝 에 나타 나 면 Iraq, Benq 와 같은 표현 식 이 잘못 되 기 때 문 입 니 다. [^ u]항상 한 글자 가 일치 해 야 하기 때문에 q 가 단어의 마지막 문자 라면 뒤의 [^ u] 는 q 뒤의 단어 구분자 (빈 칸 이나 마침표 또는 다른 것 일 수 있 습 니 다) 와 일치 하고 뒤의 / w * / b 는 다음 단어 와 일치 합 니 다. 그래서 / b / w * q [^ u]/ w * / b 는 전체 Iraq fighting 과 일치 합 니 다. 마이너스 0 폭 으로 단언 하면 이러한 문 제 를 해결 할 수 있 습 니 다. 한 위치 만 일치 하기 때문에 어떠한 문자 도 소비 하지 않 습 니 다. 지금 우 리 는 이렇게 이 문 제 를 해결 할 수 있 습 니 다. / b / w * q (?! u) / w * / b.
0 너비 마이너스 예측 선행 단언 (?! exp) 은 이 위치의 뒤에 표현 식 exp 가 일치 하지 않 는 다 고 단언 합 니 다. 예 를 들 어 / d {3} (?! / d) 은 세 자리 숫자 와 일치 하고 이 세 자리 숫자의 뒤 에는 숫자 가 될 수 없습니다. / b (? abc) / w) + / b 는 연속 문자열 abc 가 포함 되 지 않 은 단어 와 일치 합 니 다.
마찬가지 로, 우 리 는 (?! exp), 0 폭 을 돌 이 켜 보고 단언 을 해서 이 위치의 앞 에 표현 식 exp: (?! [a - z]) / d {7} 이 앞 에 소문 자가 아 닌 7 자리 숫자 와 일치 하지 않 는 다 고 단언 할 수 있 습 니 다.
더 복잡 한 예: (? = < (/ w +) >). * (? = < / / / 1 >) 속성 이 포함 되 지 않 은 간단 한 HTML 탭 의 내용 과 일치 합 니 다. () 는 이러한 접 두 사 를 지정 합 니 다. 괄호 로 묶 인 단어 (예 를 들 어 < b > 일 수 있 습 니 다) 다음. * (임의의 문자열), 마지막 접두사 (? = < / / / 1 >) 입 니 다.. 접두사 에 있 는 / / 를 주의 하 십시오. 접두사 에 있 는 문자 의 전 의 를 사 용 했 습 니 다. / 1 은 역방향 참조 입 니 다. 캡 처 된 첫 번 째 그룹 입 니 다. 앞의 (/ w +) 와 일치 하 는 내용 을 참조 합 니 다. 접두사 가 실제로 < b > 이면 접 두 사 는 < / b > 입 니 다. 전체 표현 식 은 < b > 와 < / b > 사이 의 내용 (접두사 와 접두사 자 체 는 포함 되 지 않 음 을 다시 한 번 알려 줍 니 다) 입 니 다.
주석
소괄호 의 또 다른 용 도 는 문법 (? \ # comment) 을 통 해 주석 을 포함 할 수 있다 는 것 이다. 예 를 들 어 2 [0 - 4] / d (? \ # 200 - 249) | 25 [0 - 5] (? \ # 250 - 255) | [01]? / d? (? \ # 0 - 199).
설명 을 포함 하려 면 '무시 모드 의 공백 문자' 옵션 을 사용 하 는 것 이 좋 습 니 다. 표현 식 을 작성 할 때 빈 칸 을 임의로 추가 할 수 있 습 니 다. Tab, 줄 을 바 꿀 수 있 습 니 다. 실제로 사용 할 때 이 옵션 을 사용 하면 \ # 뒤에서 이 줄 로 끝 나 는 모든 텍스트 를 주석 으로 무시 합 니 다.
예 를 들 어, 우 리 는 앞의 표현 식 을 이렇게 쓸 수 있다.
(?<= #
<(/w+)> # ( HTML/XML )
) #
.* #
(?= #
<///1> # : "/",
) #
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.