정규 표현 식 은 내장 구 조 를 어떻게 처리 합 니까?

6779 단어 정규 표현 식
1. 정규 표현 식 은 내장 구 조 를 어떻게 처리 합 니까?
a.       .net 내장 구조 처리 방법
예 를 들 어 설명:
질문 설명: before (nope (yes (here) okay) after 에서 가장 큰 피 () 에 포 함 된 텍스트 와 일치 합 니 다. 빨간색 부분 을 표시 합 니 다.
정 답:. net: "(? > [^ ()] + |" (? < DEPTH >) | ") (? < - DEPTH >) * (? (DEPTH) (?!)")
        분석:
        (1), "(왼쪽 괄호 와 일치 합 니 다.) 오른쪽 괄호 와 일치 합 니 다. [^ ()] + 괄호 가 아 닌 문자열 과 일치 합 니 다.
(2), (? >...) 경화 패 킷, 경화 패 킷 의 역할 은 괄호 안의 하위 표현 식 이 일치 하면 일치 하 는 내용 이 고정 되 고 다음 매 칭 과정 에서 변 하지 않 습 니 다. 전체 경화 패 킷 의 괄호 가 버 려 지지 않 는 한 외부 역 추적 에서 다시 사용 합 니 다. 이 곳 은 경화 패 킷 을 사용 하 는 역할 은 매 칭 속 도 를 높이 는 데 있 습 니 다.
(3), DEPTH 사용: DEPTH 는 실제 이름 으로 캡 처 된 를 사 용 했 습 니 다. 항상 성공 적 으로 일치 합 니 다. 정규 표현 식 엔진 의 역 추적 스 택 은 현재 성공 적 으로 그룹 을 나 누 었 는 지 에 대한 정 보 를 저장 합 니 다. (? < DEPTH >) 는 "(후, 따라서 성공 적 으로 일치 하면 저장 할 수 있 습 니 다.") 다음 구조 (? < - DEPTH >) 는. NET 만 의 구조 로 일치 합 니 다. ")성공 하면 가장 가 까 운 "successful DEPTH" 표 시 를 지 웁 니 다. 이러한 "successful DEPTH" 표 시 는 존재 하지 않 으 면 실 패 를 보고 합 니 다. 전체 정규 표현 식 은 실 패 했 습 니 다. 1. 매 칭 마다 "(정규 표현 식 에 저 장 된 현재 괄호 깊이 값 에 1; 2, 매 칭 마다") 정규 표현 식 에 저 장 된 현재 괄호 깊이 값 을 1; 3, (?) 줄 입 니 다.(?!)) 마지막 에 맞 는 것 을 확보 할 때 깊이 는 0 이다.
2. 정규 표현 식 처리 구법 분석 트 리 를 어떻게 사용 합 니까?
어떻게 정규 표현 식 을 사용 하여 다음 과 같은 문법 분석 트 리 를 식별 합 니까?
(TOP (S (NPB (DT The) (NN question) ) (VP (VBZ remains) (SBAR-A (IN whether) (S-A (NPB (PRP they) ) (VP (MD will) (VP-A (VB be) (ADJP (JJ able) (SG (VP (TO to) (VP-A (VB help) (PUNC. us.) ) ) ) ) ) ) ) ) ) ) )
정 답: "(? > [^ ()] + |" (^ () "s] +" s (? < DEPTH >) | ")" s (? < - DEPTH >) * (? (DEPTH) (?!) ")
분석 이 유사 하 다.
3. 정규 표현 식 처리 구법 으로 트 리 인 스 턴 스 분석
a.       정규 표현 식 을 사용 하여 모든 잎 결점 가 져 오기:    "((?[^()]+)"s(?[^()]+)")
b.      정규 표현 식 을 사용 하여 모든 명사 구 NP 를 가 져 옵 니 다.
"(NP"s(?>[^()]+|"([^()"s]+"s(?)|")"s(?<-DEPTH>))*(?(DEPTH)(?!))")
c.       정규 표현 식 을 사용 하여 다음 과 같은 성질 을 만족 시 키 는 하위 트 리 를 가 져 옵 니 다.
        i.   이 절의 표 시 는 SBAR [^ ()] * 입 니 다.
                   ii.      이 자구 의 뿌리 부분 에 있 는 첫 번 째 아들 은 하나의 품사 가 IN 이라는 단어 이다.
                  iii.      이 자구 의 두 번 째 아들 은 하나의 자구 이다. S [^ ()] * 로 식별 한다.
                 iv.      이 자 구 는 다른 아들 이 없다.
(? < Clause > > "(S [^ ()]] *" s (? < INWH > "(IN" s [^ ()]] + ")" s (? < ClauseAfterInWh > > "(S [^ ()] * *" s (? > [^ ()]]] + | "([^ ()" s] + "s (? < DEPTH >) |" s (? < < < < - DEPTTH >) * (? (DEPTH)) * (? (DEPTH) (?!!) "s)" s (? \ # Clause) 템 플 릿 엔진 을 개발 하 던 중 정규 표현 식 을 사용 하기 어 려 운 표현 식 을 사용 하기 어 려 운 정규 표현 식 으로 비교 비교 하기 어 려 운 표현 식 을 만 나 비교 표현 식 으로 비교 하기 어 려 운 표현 식 을 만 처 리 된 상황 은 무한 한 끼 워 넣 기 구조의 일치 입 니 다. HTML 라벨 은 이러한 구조 에 속 합 니 다.
    구체 적 인 예 를 들 어 다음은 우리 가 일치 해 야 할 내용 입 니 다.
1

            2

            3

            4

            5

            
<x>

            <x></x>

            <y></y>

            </x>

            <x></x>

    정규 로 무한 층 끼 워 넣 기 구 조 를 일치 시 키 는 방법 을 찾기 전에 나 는 커 브 길 을 돌아 서 무한 층 끼 워 넣 기 구조 에 대한 매 칭 을 실현 할 수 밖 에 없다.
    나 는 정규 로 모든 독립 된 탭 을 일치 시 킨 다음 에 첫 번 째 탭 이름 x 를 매개 변수 로 하여 일치 하 는 모든 독립 된 탭 을 하나씩 찾 아서 그 가 첫 번 째 x 에 대응 하 는 닫 힌 탭 인지 확인 할 수 밖 에 없다.
    이런 방식 은 끼 워 넣 은 층 차 를 판단 하 는 코드 를 더 해 야 하고 쓸모없는 데 이 터 를 많이 일치 시 키 고 순환 시 켜 야 한다.
    나중에 야 나 는. NET 이 정규 표현 식 의 확장 기능 을 제공 하여 무한 층 내장 구조의 매 칭 을 처리 하 는 데 도움 을 주 었 다 는 것 을 알 게 되 었 다. 이러한 특성 은. NET 특유 의 것 으로 다른 프로 그래 밍 언어 나 플랫폼 이 반드시 있 는 것 은 아니다.
    우 리 는 모두 정규 일치 그룹의 개념 을 알 고 있 습 니 다. 그것 의 문법 은 (? < 그룹 이름 >) 입 니 다. 이 정규 문법 을 사용 하면 우 리 는 일치 하 는 그룹 을 만 들 수 있 습 니 다. 사실은 이것 은 스 택 에 들 어 가 는 과정 입 니 다.
    . NET 은 정규 매 칭 그룹 에 대해 특별한 지원 을 했 습 니 다 (? < - 그룹 이름 >). 이 정규 문법 을 사용 하면 지정 한 그룹 이름 의 마지막 매 칭 결 과 를 제거 할 수 있 습 니 다. 즉, 스 택 에서 나 온 것 입 니 다.
    하 나 는 창고 에 들 어가 고 하 나 는 창고 에서 나 옵 니 다. 이 하 나 는 창고 에 들 어가 자마자 무한 층 끼 워 넣 기 에 일치 하 는 가능성 을 제공 합 니 다.
    다음 예 를 들 어 무한 층 끼 워 넣 기 매 칭 을 어떻게 실현 하 는 지 보 겠 습 니 다.
    그림 에서 우 리 는 정규 가 가장 꼭대기 층 의 세 개의 < x > < / x > 구 조 를 정확하게 일치 시 켰 고 두 번 째 < x > < / x > 구조 에 포 함 된 라벨 은 구조의 내용 으로 여 겨 졌 다 는 것 을 알 수 있다. 이것 은 어떻게 하 는 것 일 까?
    다음은 그림 의 정규 입 니 다. 저 는 주석 을 넣 었 습 니 다.
1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            
<x>

            (?>

            <x>(?<n>)           #    <x> ,    n  

            |

            </x>(?<-n>)        #    </x> ,    n  

            |

            (?!<x>|</x>).      #   <x> </x>       

            )*

            (?(n)(?!))              #             n,     ,    

            </x>

    이 정규 에 서 는 평소 사용 하지 않 았 던 (?! (name) yes | no) 문법 도 사 용 됩 니 다. 이 문법 은 C 언어의 if 문법 에 해당 하 며 조건 판단 에 사 용 됩 니 다. 위의 정규 에 서 는 이름 그룹 n 이 존재 하 는 지 여 부 를 세 션 으로 사용 합 니 다. 이름 그룹 n 이 존재 한다 면 대칭 적 으로 닫 히 지 않 았 음 을 설명 합 니 다. (?!) 단언 으로 일치 하 는 데 실 패 했 습 니 다. 다시 일치 합 니 다.
    《 Mastering Regular Expressions 》 에 서 는 이러한 무한 층 내장 구조의 일치 에 대해 언급 한 것 같 지만, 나 는 이 책 을 가지 고 있 지 않다. 나 는 여기, 이곳 에서 이런 특수 한 정규 문법 을 배 웠 으 니, 여러분 은 참고 하 실 수 있 습 니 다.
 
 

좋은 웹페이지 즐겨찾기