< не очень хороший регулярное выражение (. *). Классификатор звезды жадный, и он будет потреблять все входные данные, но тогда механизм регулярных выражений заметит, что после него что-то есть, и он начнет возвращаться, пока не найдет следующий текст (в данном случае это меньше, чем знак). Это может привести к серьезным результатам. Например, у меня был один из них в некотором коде (я был ленивым - плохим программистом!), И он выполнял что-то вроде 1100+ миллисекунд, чтобы выполнить на очень маленькой входной строке.
Лучшее выражение было бы что-то вроде этого "hello=([^<]*)<"
Скобки []
образует класс символов, но с каратом ^
в качестве первой записи в классе символов, это сводит на нет класса. то есть его высказывание находит символы, которые не находятся в следующем наборе, а затем вы добавляете завершающий символ <
, и механизм регулярных выражений будет искать, пока он не найдет меньше знака без необходимости возврата.
Я взломал быстрый пример использования необработанных классов регулярных Java в clojure, чтобы убедиться, что мое регулярное выражение работает. Я проигнорировал встроенную поддержку регулярных выражений в clojure, чтобы показать, что он работает с обычным Java API, чтобы убедиться, что его аспект понятен. (Это не хороший пример того, как делать регулярные выражения в clojure.) Я добавил комментарии (они следуют за ;; в примере), которые переводят на Java, но должно быть довольно ясно, что происходит, если вы знаете API-интерфейсы regex ,
;; create a pattern object
user=> (def p (java.util.regex.Pattern/compile "hello=([^<]*)<"))
#'user/p
;; create a matcher for the string
user=> (def m (.matcher p "hello=bruce8392382<"))
#'user/m
;; call m.matches()
user=> (.matches m)
true
;; call m.group(1)
user=> (.group m 1)
"bruce8392382"
Это регулярное выражение выглядит разумным. Как это не работает? На какой вклад? Не могли бы вы показать код, который использует этот шаблон? –
... например: http://www.regexplanet.com/cookbook/agtyZWdleHBsYW5ldHIMCxIGUmVjaXBlGAEM/index.html –