2010-05-22 7 views
2

특정 문자열 유형의 역함과 일치하는 정규식을 만들려고합니다 (예 : ".js"로 끝나지 않는 문자열).라켓 정규식 일치

문서에 따르면이 표현식은 #rx"(?!\\.js$)"이어야하며 작동하지 않는 것으로 보입니다. 예상대로

 
(define (match-test regex) 
    (map (lambda (text) 
      (regexp-match? regex text)) 
     '("foo.js" "bar.css" "baz.html" "mumble.gif" "foobar")))

(match-test #rx"\\.js$") 반환 (#t #f #f #f #f)하지만 (match-test #rx"(?!\\.js$)") 반환 내가 (#f #t #t #t #t)을 기대 (#t #t #t #t #t) : 그것을 테스트하기 위해,이 기능을 가지고있다.

무엇이 잘못 되었습니까? 실제로 "[x]가 포함되지 않은 모든 것과 일치하는"아이디어를 표현하기 위해 Racket의 정규식을 얻으시겠습니까?

+0

부록 : 충분한 담당자를 가지고 거기에 사람이 있다면, 당신은 "라켓"을 만들 수 있습니다 또는 "racket-을 체계 "꼬리표. 아직 계획이 없으며 PLT 계획 팀원들은 프로젝트 이름을 변경하려고합니다. – Inaimathi

+1

당신을 위해 태그를 추가했습니다. –

+0

네가 부정을 얻기 위해 (결과의이 함수를 매핑 할 수 없다) 특별한 이유가 있습니까? 아니면 이것이 더 이상 "왜 이것이 작동하지 않는지 이해하고 싶습니다"라는 질문입니까? – jakebman

답변

2

그렇지 않으면 문자열의 아무 곳에서나 성공적으로 일치 할 수 있거나 (또는 ​​원하는 경우 성공적으로 일치하지 않을 수 있기 때문에) 음수 일치를 앵커링해야합니다. 문자열의 끝 부분에 정규 표현식을 고정시킬 수 있고 마지막 몇 문자를 확인하기 위해 음수 lookbehind를 사용할 수 있습니다. 나는 계획 구문에 익숙하지 해요,하지만 난 당신이 사용할 수있는 상상 "가 포함되어 있지 않습니다 아무것도 일치하는 아이디어를 표현하기 위해 실제로 라켓에 정규식을받을 수 있나요

#rx"(?<!\\.js)$" 

방법을 [x] "

조금 더 까다 롭습니다. 문자열의 모든 문자에 대해 부정적인 미리보기를 사용할 수 있습니다. 여기에 foo이 포함되지 않은 문자열을 일치시키는 방법이 있습니다. 또이 제도에 꽤 작업을 수행하는 경우 죄송하지만 생각 증명해야합니다

#rx"^((?!foo).)*$"