Regex помощь в Java - PullRequest
       0

Regex помощь в Java

0 голосов
/ 21 декабря 2011

Я пытаюсь извлечь информацию из этих тегов в соответствии с

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

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

hello=(.*)<

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

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

Ответы [ 3 ]

1 голос
/ 21 декабря 2011

(. *) <Не совсем хорошее регулярное выражение. Квалификатор 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"
0 голосов
/ 21 декабря 2011

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

Pattern p = Pattern.compile("hello=(.*)<");
Matcher m = p.matcher("hello=bruce8392382<");
if (m.matches) {
    System.out.println(m.group(1));
}
0 голосов
/ 21 декабря 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...