我正在尝试创建一个匹配某个字符串类型的倒数的正则表达式(例如,字符串不以“.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 :(得分:2)
您需要锚定否定匹配,否则它可以在字符串中的任何位置成功匹配(或者如果您愿意,则成功匹配)。您可以将正则表达式锚定到字符串的末尾,并使用负向lookbehind来检查最后几个字符。我不熟悉Scheme语法,但我想你可以使用它:
#rx"(?<!\\.js)$"
如何在Racket中实际使用正则表达式来表达“匹配任何不包含[x]”的内容
这有点棘手。您可以对字符串中的每个字符使用负向前瞻。以下是在任何地方匹配不包含foo
的字符串的方法。再次道歉,如果这在Scheme中不起作用,但它应该证明这个想法:
#rx"^((?!foo).)*$"