정규 표현 식 - 탐욕 과 비 탐욕 (타성)

3938 단어
필드 사용
때때로 우 리 는 정규 로 어떤 문자열 로 시작 하고 어떤 문자열 이나 문자 로 끝 나 는 하위 문자열 을 일치 시 키 고 싶 지만, 끝 나 는 문자열 이나 문 자 는 원래 문자열 에 여러 번 나타 나 지만, 우 리 는 처음부터 처음 나타 나 는 곳 까지 만 일치 하고 싶 습 니 다. 다시 말 하면 시작 과 끝 사이 의 내용 이 가장 적 게 일치 하고 싶 습 니 다.
정규 적 인 탐욕 과 비 탐욕 (타성)
일반적으로 다음 과 같은 문자 클래스 를 사용 하여 전도 문자 의 중복 특징 을 설명 합 니 다. 1.?:엔진 에 선도 문자 와 0 번 또는 한 번 일치 하 는 것 을 알려 줍 니 다.사실은 선도 문 자 를 선택 할 수 있 음 을 나타 낸다.2. +: 엔진 에 선도 문자 와 1 번 또는 여러 번 일치 하 는 지 알려 줍 니 다.3. *: 엔진 에 선도 문자 와 0 번 또는 여러 번 일치 하 는 지 알려 줍 니 다.4. {min, max}: 엔진 에 선도 문자 min 회 에서 max 회 까지 알려 줍 니 다.min 과 max 는 모두 비 마이너스 정수 이다.쉼표 가 있 고 max 가 생략 되면 max 에 제한 이 없다 는 뜻 입 니 다.쉼표 와 max 가 모두 생략 되면 min 회 반복 을 표시 합 니 다.따라서 {0,} 은 * 와 같 고 {1,} 과 + 의 역할 이 같 습 니 다.
탐 욕 스 럽 다
기본적으로? + *{min, max} 은 모두 탐욕 적 입 니 다. 즉, 선도 문자 에 따라 가능 한 한 많은 내용 을 일치 시 킵 니 다.
비 탐욕 (타성)
탐욕 이 아 닌 것 은 가능 한 한 적은 내용 과 일치 하 는 것 이다.
원리 가 평이 하 다.
실례 를 결합 하여 정규 엔진 을 바탕 으로 텍스트 에 대한 일치 과정 을 분석한다.원본 문자열: This is a first test, 정규 <. > 를 사용 하여 HTML 탭 과 일치 합 니 다. 첫 번 째 일치 , 두 번 째 일치 first 를 기대 합 니 다.

< 이것 은 텍스트 문자 로 자신 과 일치 합 니 다.두 번 째 기 호 는 . 문자 E 와 일치 한 다음 + 한 줄 이 끝 날 때 까지 다른 문자 와 일치 할 수 있 습 니 다.그리고 줄 바 꿈 문자 가 도착 하면 일치 실패 . 줄 바 꿈 문자 가 일치 하지 않 습 니 다.그 러 자 엔진 은 다음 정규 표현 식 기 호 를 일치 시 키 기 시 작 했 습 니 다. 즉, 일치 하려 고 했 습 니 다 >.지금까지 <.> first test.엔진 이 > 줄 바 꿈 문자 와 일치 하려 고 시도 하 다가 실 패 했 습 니 다.그래서 엔진 은 거 슬러 올 라 갔다.돌 이 켜 보면 일치 하 는 상황 은 <.> first tes 이다.이에 따라 엔진 은 >t 를 일치 시 켰 다.분명히 실패 할 것 이다.이 과정 은 <.> first>> 와 일치 할 때 까지 계속 되 었 다.그래서 엔진 은 일치 하 는 것 을 찾 았 다 first.정규 가이드 엔진 이 급 하 다 는 것 을 기억 하 라. 그래서 그것 이 찾 은 첫 번 째 일치 하 는 것 을 급히 보고 할 것 이다.계속 거 슬러 올 라 가 는 것 이 아니 라 더 좋 은 일치 가 있 을 수 있 더 라 도 .그래서 우 리 는 + 의 탐욕 성 으로 인해 정규 표현 식 엔진 이 가장 왼쪽 의 가장 긴 일치 로 돌아 간 것 을 볼 수 있다.
원 하 는 결 과 를 얻 으 려 면 비 탐욕 모드 를 사용 해 야 합 니 다. <./>요약: 탐욕 일치 모드 라면 정규 엔진 은 문자열 의 마지막 까지 일치 합 니 다.false 와 일치 할 때 마지막 첫 번 째 일치 하 는 위 치 를 찾 아 일치 하 는 결 과 를 되 돌려 줍 니 다.탐욕 이 아 닌 일치 모드 라면 정규 엔진 은 pattern 의 끝 에 맞 는 문자 와 일치 합 니 다. 그리고 한 걸음 더 뒤로 가면 false 와 일치 하 는 것 을 발견 하면 최근 에 true 와 일치 하 는 위 치 를 찾 아 일치 하 는 결 과 를 되 돌려 줍 니 다.
실례
예 를 들 어 원본 문자열:

{"accesskey":{"acccessKeyId":"XhUURxsMlJE6EiXf","accessKeySecret":"Q9fMpgBgRnKycMRD28MMkkFMbiNkbY"},"dbGrant":{"0000031736":"READWRITE"},"dbSchemaId":"0000031737"}

이 부분 에 대한 민감 한 정 보 를 빈 문자열 로 바 꾸 려 고 합 니 다.
"accesskey":{"acccessKeyId":"XhUURxsMlJE6EiXf","accessKeySecret":"Q9fMpgBgRnKycMRD28MMkkFMbiNkbY"},

끝 에 있 는 쉼표 를 고려 하지 않 고 'accesskey' 를 시도 합 니 다. \ {. + \} 은 원본 문자열 의 끝 에 있 는} 문자 와 직접 일치 합 니 다. 엔진 은 기본적으로 가능 한 한 많은 내용 과 일치 하기 때 문 입 니 다.
탐욕 성 을 고려 하여 "accesskey": \ {. + \} +?,일치 결과 가 같다.나 니?설마 내 가 탐욕 성에 대한 이해 에 문제 가 있 는 건 아니 겠 지?빗질 하 는 자 세 를 사용 합 니 다. 시작 위치 에 나타 난 첫 번 째} 문자 와 일치 하 기 를 바 랍 니 다. 해당 하 는 표현 식 부분 은 \ \} +? 입 니 다.비 탐욕 모드 로 문 제 를 분석 합 니 다. 하나 이상 의} 문 자 를 일치 시 키 고 가능 한 한 적은 내용 과 일치 하 기 를 바 랍 니 다. 그러나 원본 문자열 에 서 는} 문 자 는 분리 되 어 있 으 며 연속 이 없 으 며 어쨌든 하나의 단독} 문자 만 일치 할 수 있 습 니 다.} 문자 에 대한 탐욕 모드 매 칭 이 통 하지 않 음 을 알 수 있 습 니 다.
시작 위치 에 일치 하려 면 첫 번 째} 문 자 는 시작 위치 와 끝} 문자 사이 의 내용 이 가장 적 고 정규 부분 은 '+?' 로 변경 할 수 있 습 니 다.전체 표현 식: "accesskey": \ {. +? \}, 테스트 일치 결과, 타당 합 니 다.
참고 자원
정규 역 추적 깊이 의 정규 (1) 정규 진급 (2) - 역 추적 인용, 앞 뒤 찾기, 삽입 조건 정규 학습 노트 (6) 앞으로 찾기 와 뒤로 찾기 정규 - 앞으로 일치, 뒤로 일치, 마이너스 앞으로 일치, 마이너스 뒤로 일치

좋은 웹페이지 즐겨찾기