Сопоставление регулярных выражений 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]»?


person Inaimathi    schedule 22.05.2010    source источник
comment
Приложение: если есть кто-то, кто имеет достаточную репутацию, вы можете создать тег рэкета или схемы рэкета. Его пока нет, и ребята из PLT Scheme пытаются изменить название своего проекта.   -  person Inaimathi    schedule 22.05.2010
comment
Я добавил тег для вас.   -  person Mark Byers    schedule 22.05.2010
comment
Есть ли какая-то особая причина, по которой вы не можете просто (сопоставить не «результат этой функции»), чтобы получить отрицание? Или это больше похоже на то, что я хотел бы понять, почему это не рабочий вопрос?   -  person jakebman    schedule 22.05.2010
comment
Да; конкретное место, где я использую его для инициализации Racket Server. У него есть свойство servlet-regexp, которое использует регулярное выражение для определения того, к каким URI применить диспетчеризацию. Если бы это свойство могло принимать функцию, возвращающую логическое значение вместо регулярного выражения, я бы использовал предложенный вами метод.   -  person Inaimathi    schedule 23.05.2010


Ответы (1)


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

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

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

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

#rx"^((?!foo).)*$"
person Mark Byers    schedule 22.05.2010