2010-05-22 59 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).)*$"