2011-12-21 11 views
0

Я пытаюсь извлечь информацию внутри этих тегов вдоль линийRegex помощь в Java

  • привет = barry0238293 <
  • привет = terry2938298 <
  • привет = bruce8392382 <

Выражение, которое я написал, это

hello=(.*)< 

Я думал, что это сработало бы, но это не так.

Не могли бы вы указать мне в правильном направлении, если я делаю это совершенно неправильно?

+1

Это регулярное выражение выглядит разумным. Как это не работает? На какой вклад? Не могли бы вы показать код, который использует этот шаблон? –

+0

... например: http://www.regexplanet.com/cookbook/agtyZWdleHBsYW5ldHIMCxIGUmVjaXBlGAEM/index.html –

ответ

0

Я считаю, что это должно быть близко: /hello\=(\w*)\</

«=» и «<» являются мета-символы так добавляющие «\» перед ними убеждается, что они должным образом признаны. '\ w' соответствует [a-zA-Z0-9], но если вам нужно разделение между именем и номером, вы можете заменить его чем-то вроде ([a-zA-Z]+\d+).

(.*) не работает, потому что он жадный, что означает, что он будет соответствовать «<» в конце. Возможно, вам придется настроить это дальше, но это должно помочь вам начать работу.

+1

Это должно быть '' hello = (\\ w *) <"'.В исходном коде Java регулярные выражения всегда записываются в виде строковых литералов, а не как литералы регулярных выражений (с ведущими и конечными '/'), как в JavaScript или Perl. Кроме того, '=' и '<' являются * не * метасимволами и не требуют экранирования. –

0

Это работает:

Pattern p = Pattern.compile("hello=(.*)<"); 
Matcher m = p.matcher("hello=bruce8392382<"); 
if (m.matches) { 
    System.out.println(m.group(1)); 
} 
1

< не очень хороший регулярное выражение (. *). Классификатор звезды жадный, и он будет потреблять все входные данные, но тогда механизм регулярных выражений заметит, что после него что-то есть, и он начнет возвращаться, пока не найдет следующий текст (в данном случае это меньше, чем знак). Это может привести к серьезным результатам. Например, у меня был один из них в некотором коде (я был ленивым - плохим программистом!), И он выполнял что-то вроде 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"