(. *) <Не совсем хорошее регулярное выражение. Квалификатор star является жадным, и он будет использовать весь ввод, но затем механизм регулярных выражений заметит, что после него что-то есть, и начнет возвращаться, пока не найдет следующий текст (в данном случае знак «меньше»). Это может привести к серьезным сбоям в производительности. Например, у меня был один из них в некотором коде (я был ленив - плохой программист!), И для выполнения очень маленькой входной строки потребовалось около 1100+ миллисекунд. </p>
Лучшим выражением будет что-то вроде этого "hello=([^<]*)<"
Скобки []
образуют класс персонажа, но с каратой ^
в качестве первой записи в классе персонажа, он отрицает класс. то есть его поговорка находит символы, которые не входят в следующий набор, а затем вы добавляете завершающий символ <
, и механизм регулярных выражений будет искать, пока не найдет знак «меньше», без необходимости возврата назад.
Я взломал быстрый пример использования необработанных классов регулярных выражений Java в clojure, чтобы быть уверенным, что мое регулярное выражение работает. Я игнорировал встроенную поддержку регулярных выражений в clojure, чтобы показать, что она работает с обычным Java API, чтобы убедиться, что этот аспект ясен. (Это не хороший пример того, как делать регулярные выражения в clojure.) Я добавил комментарии (они следуют за ;; в примере), которые переводят на Java, но должно быть достаточно ясно, что происходит, если вы знаете API регулярных выражений .
;; 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"