2010-05-22 90 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$)")回報(#t #t #t #t #t),在那裏我會想到(#f #t #t #t #t)

我在做什麼錯,我如何在Racket中實際得到一個正則表達式來表達「匹配任何不包含[x]」的想法?

+0

附錄:如果有一個人在那裏誰擁有足夠的代表,你可能想創建一個「拍」或「racket-計劃「標籤。目前還沒有人,PLT計劃的人正試圖改變他們的項目名稱。 – Inaimathi 2010-05-22 17:02:35

+1

我爲你添加了標籤。 – 2010-05-22 17:04:23

+0

是否有任何特殊的原因,你不能只是(映射不是這個函數的結果)來得到否定?或者這更多的是「我想明白爲什麼這不起作用」的問題? – jakebman 2010-05-22 19:59:42

回答

2

您需要錨定否定匹配,否則它可以在字符串中的任何位置成功匹配(或者成功不匹配,如果您喜歡)。您可以將正則表達式定位到字符串的末尾,並使用負向後視來檢查最後幾個字符。我不熟悉該計劃的語法,但我想,你可以使用這個:

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

和我怎麼居然在球拍得到一個正則表達式來表達想法「匹配任何不包含[x]「

這有點棘手。您可以對字符串中的每個字符使用負向預覽。以下是如何匹配任何地方不包含foo的字符串。再次道歉,如果這確實在計劃不太工作,但它應該表現出的理念是:

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