연속 문자열 이 포함 되 지 않 은 줄 에 0 폭 단언 을 사용 합 니 다.

4444 단어 문자열
원문 주소: http://blog.khotyn.com/blog/2013/07/24/zero-width-assert/
최근 작업 중 문제 가 발생 했 습 니 다. N 개의 문자열 이 있 습 니 다. 특정한 연속 문자열 (예 를 들 어 abc) 이 포함 되 지 않 은 문자열 을 정규 표현 식 으로 걸 러 내야 합 니 다.
인터넷 에서 한 줌 을 찾 아 보 았 는데 Perl 5 의 정규 표현 식 에서 0 폭 의 단언 이 있 는 것 을 찾 았 습 니 다. 매우 강력 합 니 다. 먼저 0 폭 의 단언 이 무엇 인지 알 아 보 겠 습 니 다.
쉽게 말 하면 제로 폭 의 단언 은 어떤 내용 이 있 기 전이 나 그 후의 것 을 찾 는 것 이다. 이렇게 해석 하면 추상 적일 수 있다. 우 리 는 몇 가지 제로 폭 의 단언 을 구체 적 으로 살 펴 보 자.
  • (? = exp): 이 0 폭 단언 은 자신 이 나타 난 위 치 를 단언 한 후에 표현 식 exp 와 일치 할 수 있 습 니 다. 아래 의 정규 표현 식 q (? = u) 를 고려 하면 이 정규 표현 식 은 뒤의 문자 와 일치 하 는 q
  • 를 표시 합 니 다.
  • (?! exp): 이 0 폭 단언 은 자신 이 나타 난 위 치 를 단언 한 후에 표현 식 exp 와 일치 하지 않 습 니 다. 아래 의 정규 표현 식 q (?! u) 를 보 세 요. 이 정규 표현 식 은 뒤의 문자 와 일치 하 는 것 이 u 의 q
  • 가 아니 라 는 것 을 나타 냅 니 다.
  • (? < = exp): 이 0 폭 단언 은 자신 이 나타 난 위 치 를 단언 하기 전에 표현 식 exp
  • 와 일치 할 수 있 습 니 다.
  • (? 와 일치 하지 않 습 니 다.
    0 폭 의 단언 을 이해 할 때 주의해 야 할 것 은 그것 이 일종 의 단언 이라는 것 이다. 즉, 0 폭 의 단언 은 일치 하지 않 는 것 만 알려 줄 뿐 문자열 안의 내용 을 '소비' 하지 않 는 다 는 것 이다. 나 는 아래 의 이 예 로 이 상황 을 설명 한다.
    우 리 는 정규 표현 식 이 있다.  k(?=h)otyn khotyn 과 일치 합 니 다. 언뜻 보기 에는 이 일치 가 성공 할 것 입 니 다. 그러나 0 폭 의 단언 은 단언 만 하고 '일치 하 는 문자열 을 소비 하지 않 기 때문에 사실상 이 정규 표현 식 은 뒤에 h 의 k 이 고 이 k 의 뒤 에는 otyn 입 니 다. 그러면 이 정규 표현 식 은 어떤 문자열 이 든 일치 하지 않 습 니 다. 실패 합 니 다.(옳 은 것 은  k(?=h)hotyn 그러나 이렇게 0 폭 의 단언 을 덧 붙 이 는 것 은 의미 가 없다.
    0 폭 의 단언 을 이해 한 후에 "abc" 가 포함 되 지 않 은 문자열 과 일치 하 는 방법 을 살 펴 보 겠 습 니 다. 다음은 제 가 쓴 결과 입 니 다.
    1
    
    
    ((?!abc).)+

    우선 이 정규 표현 식 에 있 는  (?!abc).  부분, 이 부분 은 빈 문자 뒤에 문자열 abc 와 일치 하지 않 으 며, 이 빈 문자열 뒤에 임의의 문자 가 있다 고 단언 합 니 다.
    다음 코드 를 살 펴 보 겠 습 니 다.
    1
    
    2
    
    3
    
    4
    
    
    Pattern pattern = new Perl5Compiler().compile("((?!abc).)+"); Perl5Matcher matcher = new Perl5Matcher(); System.out.println(matcher.matches("abc", pattern)); System.out.println(matcher.matches("abdas dfas", pattern)); 

    이 코드 의 실행 결 과 는:
    1
    
    2
    
    
    false true 

    첫 번 째 일치 실 패 는 문자 'a' 앞의 빈 문자 뒤에 문자열 'abc' 가 일치 하기 때문에 단언 이 실 패 했 고 일치 에 실 패 했 습 니 다.
    두 번 째 일치 가 성공 한 것 은 빈 문자 뒤에 'abc' 가 나타 나 지 않 았 기 때 문 입 니 다. 일치 가 성공 하기 때 문 입 니 다.
    마지막 으로 + 번 호 를 더 한 이 유 는 완전히 일치 할 수 있 기 때 문 입 니 다. 그 어떠한 문자 도 그 자체 가 'a' 가 아니 고 그 뒤에 'bc' 가 아니라면 '(?! abc)' 와 일치 할 수 있 기 때 문 입 니 다. 따라서 하나의 문자열 에 abc 가 포함 되 어 있 지 않 으 면 완전히 일치 할 수 있 습 니 다 (? abc).) +
    PS: 이 글 은 사실 몇 년 전에 쓴 것 입 니 다. 예전 에 블 로그 가 닫 혔 고 데이터 가 없어 졌 습 니 다. 다행히 Ieye 에 한 부 더 있어 서 이 사 했 습 니 다. 요 몇 년 동안 저 는 이 방식 으로 온라인 서버 의 로 그 를 분 석 했 습 니 다. 제로 폭 의 단언 이 있어 서 많은 번 거 로 움 을 줄 였 습 니 다. 포 지 셔 닝 문제 의 속도 도 많이 빨 라 졌 습 니 다. 제로 폭 의 단언 은 확실히 하나 입 니 다.아주 날 카 로 운 물건 이 야.
  • 좋은 웹페이지 즐겨찾기