2010-05-22 4 views
2

Я пытаюсь создать регулярное выражение, которое соответствует инверсии определенного типа строки (так что строки, не заканчивающиеся на .js ", например).Racket регулярное выражение соответствие

В соответствии с документацией это должно быть выражение #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 Scheme пытаются изменить название своего проекта. – Inaimathi

+1

Я добавил тэг для вас. –

+0

Есть ли какая-то особая причина, по которой вы не можете просто (наметить «результат-из-этой-функции»), чтобы получить отрицание? Или это скорее вопрос «Я бы хотел понять, почему это не работает»? – jakebman

ответ

2

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

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

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

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

#rx"^((?!foo).)*$" 
Смежные вопросы