球拍正则表达式匹配

时间:2010-05-22 16:57:23

标签: regex scheme racket

我正在尝试创建一个匹配某个字符串类型的倒数的正则表达式(例如,字符串不以“.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]”的想法?

1 个答案:

答案 0 :(得分:2)

您需要锚定否定匹配,否则它可以在字符串中的任何位置成功匹配(或者如果您愿意,则成功匹配)。您可以将正则表达式锚定到字符串的末尾,并使用负向lookbehind来检查最后几个字符。我不熟悉Scheme语法,但我想你可以使用它:

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

如何在Racket中实际使用正则表达式来表达“匹配任何不包含[x]”的内容

这有点棘手。您可以对字符串中的每个字符使用负向前瞻。以下是在任何地方匹配不包含foo的字符串的方法。再次道歉,如果这在Scheme中不起作用,但它应该证明这个想法:

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