Соответствие регулярному выражению ракетки - PullRequest
2 голосов
/ 22 мая 2010

Я пытаюсь создать регулярное выражение, совпадающее с обратным определенному типу строки (например, строки, не заканчивающиеся на ".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 Ответ

2 голосов
/ 22 мая 2010

Вам нужно привязать отрицательное совпадение, потому что в противном случае оно может успешно совпадать (или успешно не совпадать, если хотите) в любом месте строки. Вы можете привязать регулярное выражение к концу строки и использовать отрицательный взгляд назад, чтобы проверить последние несколько символов. Я не знаком с синтаксисом Scheme, но думаю, что вы можете использовать это:

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

и как я могу получить регулярное выражение в Racket, чтобы выразить идею "соответствовать чему-либо, что не содержит [x]"

Это немного сложнее. Вы можете использовать отрицательный взгляд для каждого символа в вашей строке. Вот как найти строку, не содержащую foo. Снова извиняюсь, если это не совсем работает в Схеме, но это должно продемонстрировать идею:

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