정규 표현 식 캡 처 그룹 과 비 캡 처 그룹
5026 단어 Jquery 학습
(?:X)
(?=X)
(?<=X)
(?!X)
(?
포획 하 다.
책 이 캡 처 를 이해 하려 면 그룹 부터 시작 해 야 합 니 다. 단일 문 자 를 반복 하면 한정 문 자 를 사용 할 수 있 습 니 다. 문자열 을 반복 하면 무엇 을 사용 하 시 겠 습 니까? 네! 작은 괄호, 작은 괄호 로 지정 한 표현 식 (하위 문자열) 을 감 싸 는 것 이 그룹 입 니 다. 그 다음 에 이 하위 표 의 중복 횟수 를 제한 할 수 있 습 니 다.
그렇다면 캡 처 는 무엇 일 까요? 작은 괄호 로 하위 표현 식 을 지정 한 후, 이 하위 표현 식 과 일치 하 는 텍스트 (즉, 일치 하 는 내용) 는 표현 식 이나 다른 과정 에서 이어서 사용 할 수 있 습 니 다. 어떻게 사용 합 니까? 최소한 포인터 같은 인용 이 있어 야 하 죠? 네! 기본 적 인 상황 에서 각 그룹 (작은 괄호) 은 자동 으로 사 용 됩 니 다.
그룹 번 호 를 가지 고 있 습 니 다. 왼쪽 에서 오른쪽으로 그룹의 왼쪽 괄호 를 표시 합 니 다. 첫 번 째 로 나타 난 그룹 번 호 는 1 이 고 나중에 증가 합 니 다. 끼 워 넣 기 가 나타 나 면,
예 를 들 면:
“aabcd”
정규
(a(b))(c)
match 결 과 를 사용 하여 입력:패 킷
포획 하 다.
$1(group1)
ab
$2(group2)
b
$3(group3)
c
자 세 를 계속 높이다.
1. (?:) 비 포획 팀 이 떠 납 니 다.
다음 예 에서 비 포획 팀 에 대한 학습 을 야기 합 니 다.
두 가지 금액 이 있 습 니 다. 6000 달러 와 1000 달러 입 니 다.
수 요 는 금액 과 화폐 종 류 를 얻 는 것 이다.
"쓸데없는 말 은 그만 하고 정칙 을 많이 써 라":
(\d+)+([$¥])
출력 결 과 는:
6000 $
OK, 요 구 를 만족 시 켰 습 니 다. 이곳 의 정규 는 두 그룹 으로 나 뉘 었 습 니 다. 하 나 는 (d +) 이 고 하 나 는 (65509 달러) 이 며, 이전 그룹 ($1) 은 금액 과 일치 하 며, 다음 그룹 ($2) 은 화폐 종류 와 일치 합 니 다.
이제 수요 가 바 뀌 었 습 니 다!! 저 는 이 정규 가 필요 합 니 다. 부동 소수점 앞 에 있 는 정수 와 일치 할 수 있 습 니 다. 예 를 들 어 1001.086 * 65509 ℃, 10010 과 65509 ℃ 를 추출 할 수 있 습 니 다.
그렇다면 정 칙 은 다음 과 같다.
(\d+)(\.?)(\d)([$¥])
여기 서 괄호 로 네 그룹 을 나 누 었 기 때문에 출력 금액 의 정수 부분 과 종 류 는 각각 $1, $4 를 져 야 합 니 다. 출력 부분 과 정규 가 분리 되 어 있다 면 출력 부분의 코드 만 수정 하고 싶 습 니 다. 즉, $1, $2 를 출력 으로 사용 하고 싶 습 니 다. 이 를 통 해 비 포획 그룹 (?:) 을 끌 어 낼 수 있 습 니 다.
앞의 정규 를 다음 과 같이 수정 합 니 다.
(\d+)(?:\.?)(?:\d+)([¥$])$
이렇게 해서 $1, $2 를 출력 으로 했 습 니 다. 똑 같이 10010 과 65509 를 출력 했 습 니 다.
이 정규 중간 두 그룹 은 비 포획 그룹 (?:) 을 사용 합 니 다. 포획 하지 않 고 그룹 만 나 누 는 것 으로 이해 할 수 있 습 니 다.
2. (? =) 와 (? =) 앞 뒤 찾기
어떤 자 료 는 그것들 을 긍정 적 인 앞으로 찾기 와 긍정 적 인 뒤로 찾기 라 고 한다.
긍정 적 인 순서 로 둘 러 보고 긍정 적 인 역순 으로 둘 러 보 는 자료 도 있다.
1. 아래 의 예 를 직접 본다.
[0-9a-z]{2}(?=aa) var str = "12332aa438aaf";
Match List:
1
32
2
38
이 정규 의 뜻 은 이 문자열 과 일치 합 니 다. 이 문자열 은 만족 해 야 합 니 다. 두 글자 (숫자 또는 알파벳) 이 고 뒤에 두 개의 a 가 붙 어 있 습 니 다.
분석 해 보 세 요:
32aa 라 는 하위 문자열 은 이 조건 을 만족 시 키 기 때문에 일치 할 수 있 습 니 다. 또한 (? =) 부분 은 캡 처 되 지 않 기 때문에 출력 은 32 일 뿐 aa 를 포함 하지 않 습 니 다. 같은 이치 로 38aa 도 이 정규 와 일치 하고 출력 은 38 에 불과 합 니 다.
다시 한 번 깊이 들 어가 보 자.
str 가 처음으로 32 를 성공 적 으로 출력 한 후에 프로그램 은 계속 뒤로 가서 일치 하 는 다른 하위 문자열 이 있 는 지 찾 아야 합 니 다. 그러면 이 때 는 32aa 의 뒷 자리 부터 뒤로 찾 아야 합 니까? 아니면 32 의 뒷 자리 부터 찾 아야 합 니까? 즉, 색인 5 부터 시작 합 니까? 아니면 7 부터 시작 합 니까? 32aa 의 다음 자리 부터 뒤로 찾 아야 합 니 다. 32aa 가 정규 와 일치 하기 때문에 다음 을 찾 아야 합 니 다.한 분 은 당연히 그 뒤에, 즉 4 부터 시작 합 니 다. 그러나 실제로는 32 의 뒤에, 즉 첫 번 째 a 부터 뒤로 찾 습 니 다. 원인 입 니까? (? =) 비 포획 입 니까?
API 문 서 를 찾 아 보 는 것 은 다음 과 같 습 니 다.
(?=X) X, via zero-width positive lookahead
제로 - width (0 너비) 를 볼 수 있 는 것 이 바로 이 뜻 입 니 다.
이제 문자열 을 좀 더 생각 나 게 쓰 십시오: str = "aaaaaa";
출력 보기: aa aa aa
분석 해 보 세 요:
이 문자열 은 모두 8 개의 a 가 있다.
첫 번 째 매 칭 은 쉽게 찾 을 수 있 습 니 다. 그것 은 바로 앞의 네 번 째 입 니 다. aaaa 입 니 다. 물론 세 번 째 와 네 번 째 a 는 캡 처 되 지 않 기 때문에 출력 은 첫 번 째 와 두 번 째 a 입 니 다.
이어서 계속 찾 아 보 세 요. 이 때 는 세 번 째 a 부터 시작 해서 셋 에서 여섯 까지 이 네 개의 a 구역 이 배치 되 었 기 때문에 세 번 째 a 와 네 번 째 a 를 출력 합 니 다.
이어서 계속 찾 아 보 세 요. 이 때 는 다섯 번 째 a 부터 시작 해서 다섯 번 째 부터 여덟 번 째 까지 이 네 개의 a 구역 이 배치 되 었 기 때문에 다섯 번 째 a 와 여섯 번 째 a 를 출력 합 니 다.
이 어 뒤 를 돌아 보 니 이 때 는 일곱 번 째 a 부터 시작 되 었 다. 분명히 일곱 번 째 와 여덟 번 째 a 는 정규 적 인 일치 조건 을 만족 시 키 지 못 하고 찾기 가 끝났다.
다시 한 번 연장 해 보 겠 습 니 다. 방금 말 한 상황 은 (? =) 캡 처 한 문자열 뒤에 놓 여 있 습 니 다. 앞 에 놓 으 면 어떤 결과 입 니까?
예:
(?=hopeful)hope
그것 의 출력 은 hope 이다.
정규 적 인 뜻 은 hopeful 과 일치 할 수 있 는 지, 가능 하 다 면 hopeful 의 hope 를 캡 처 하 는 것 입 니 다. 물론 뒤쪽 으로 일치 하 는 하위 문자열 을 계속 찾 는 것 은 f 부터 입 니 다.
비교 해 보면 (? = hopeful) hope 와 hope (? = ful), 두 정규 의 효 과 는 사실 같다.
2. 다음은 (? < =)
정규 를 고 쳐 라.
(?<=aa)[0-9a-z]{2};
문자열 은 str = "12332 aa 438 aaf" 입 니 다.
출력
이 정규 의 뜻 은 다음 과 같다. 이 문자열 은 두 글자 (숫자 나 자모) 이 고 앞 에 바짝 붙 어 있 는 것 은 두 글자 a 이다.
마찬가지 로 깊이 들 어가 서 str 를 str = "aaaaaa" 로 바 꾸 고 출력 이 무엇 인지 보 세 요. 마찬가지 로 aa aa aa aa.
분석 해 보 세 요:
첫 번 째 매 칭 은 말 할 필요 도 없 이 앞의 네 번 째 a 이 고 세 번 째 와 네 번 째 a 를 출력 합 니 다.
계속 뒤로 찾 아 보 세 요. 다섯 번 째 a 부터 프로그램 에서 다섯 번 째 와 여섯 번 째 a 가 만족 하 는 것 을 발 견 했 습 니 다. 두 글자 이 고 앞 에 두 개의 a (세 번 째 와 네 번 째 a) 가 붙 어 있 는 것 을 만족 시 켰 습 니 다. 그래서 일치 하 는 데 성 공 했 습 니 다. 다섯 번 째 와 여섯 번 째 a 를 출력 합 니 다.
계속 뒤로 찾 아 보 세 요. 일곱 번 째 a 부터 프로그램 은 일곱 번 째 와 여덟 번 째 a 가 만족 하 는 것 을 발 견 했 습 니 다. 두 번 째 문자 이 고 앞 에 두 개의 a (다섯 번 째 와 여섯 번 째 a) 가 붙 어 있 는 것 을 만족 시 켰 습 니 다. 그래서 일치 하 는 데 성 공 했 습 니 다. 일곱 번 째 와 여덟 번 째 a 를 출력 하 였 습 니 다. 검색 이 끝 났 습 니 다.
셋, (?!) 와 (?
외관상 으로 보면 앞의 조 와 매우 비슷 하 다. 차이 점 은 '=' 을 '!' 로 바 꾸 는 것 이다.
그 의 미 는 정반 대 이다.
[0-9a-z]{2}(?!aa)
두 글자 가 일치 하고 뒤에 바짝 붙 어 있 는 것 은 aa 가 아니 라 는 뜻 이다.(? : , aa