2012-04-10 4 views
0

Я пытаюсь «найти» очень специфичную серию символов в java, но мое регулярное выражение работает некорректно.Не удается найти только одно слово с использованием регулярных выражений

Я хочу найти слово (любое слово), затем пробел, затем перемотку вперед, затем другое пространство, затем «М» (нижний или верхний регистр), затем ряд цифр. Я использую следующую строку:

Elements rating = doc.getElementsMatchingText(Pattern.compile("\\b\\s/\\s[mM][0-9]+")); 

Но это поиск целых строк (слов до и после намеченного шаблона). Это также не помогает:

Elements rating = doc.getElementsMatchingText(Pattern.compile("^\\b\\s/\\s[mM][0-9]+"));  

Что я делаю неправильно?

+0

Итак, что именно вы хотите получить от шаблона, который вы поставляете? У вас нет групп захвата, поэтому вы можете только проверить, найден ли шаблон в некотором тексте, а не извлекать определенные данные из полученного Matcher. –

+0

попробуйте '\ w +', а не '\ b'. – jon

+0

Не публикуйте ddoouubbllee - eessccaappeedd Java. Опубликуйте ожидаемые данные и ожидаемые результаты, а также какие шаблоны вы используете. – tchrist

ответ

-1

О регулярных выражений, попробуйте:.

* \ [Mm] [1-9] *

Я использовал http://rubular.com/, чтобы проверить мое регулярное выражение, так что вы можете сделать свой эксперимент.

Bye

+0

Почему в мире кто-то будет использовать Ruby для тестирования шаблона Java? – tchrist

+0

Прежде всего потому, что это был первый тег регулярного выражения, который я нашел: P Я думал, что регулярное выражение в java и ruby ​​на базовом уровне было таким же. – Simone

+0

Я адаптирую свое регулярное выражение для java. * \\ [Mm] [1-9] *. *, Кажется, работает, но он находит всю строку. Я не эксперт, так жаль мой ответ – Simone

2

Правильный шаблон для Вашего случая является \\b\\w+\\s/\\s[mM][0-9]+.

Однако проблема, которую вы описываете, связана с используемым вами API, а не с шаблоном. Обратите внимание, что getElementsMatchingText не позволяет вам получить доступ к данным соответствия, поэтому вы не можете извлечь часть текста, которая соответствует шаблону.

Вы должны перебрать все элементы doc вручную и применить Matcher.find() к тексту каждого элемента, или просто применить Matcher.find() с той же схемой снова к тексту элементов, возвращаемых getElementsMatchingText. Затем вы сможете извлечь согласованную часть как Matcher.group().

+1

Я не думаю, что шаблон выглядит правильно; например, '\ b \ s' будет соответствовать только пробелу ASCII, который следует за символом слова Unicode. – tchrist

0

Ваше регулярное выражение имеет недостатки. Я хотел бы предложить

\w+/[Mm]\d+ 

(помните, чтобы избежать соответствующим образом, когда вы положили в строке Java)

Несколько вещей о своем регулярном выражении:

1) Вы не имеете ничего о себе Сопрягайте «word (any word)» (!!!) Я выбрал \ w + для соответствия словам только с хотя бы одним символом слова. Вы можете сделать что-то вроде \ w {2,10}, чтобы делать слова между 2 и 10 символами, например, если вы хотите продолжить настройку.

2) Вам не нужно \ б на всех, так как \ ш * совпадает только соответствует допустимые символы слов

3) иметь в виду, \ х может соответствовать больше, чем просто пространство .. Я использую только пространство, но вы можете поместить его в \ s, если у вас все в порядке с соответствующей вкладкой, новой строкой (если она настроена таким образом) и т. д.

4) Я думаю, что \ d более идиоматично и читаемо, чем [0-9]

+1

Это не имеет никакого смысла. Так называемая незахватная группа совершенно несущественна. – tchrist

+0

@tchrist - doh, вы правы в выражении \ b. Вероятно, это должно было начаться с нуля и ясным умом, а не с помощью подстроенного выражения :). Будет редактировать, спасибо! –

+0

Что касается вашей точки 2, то существует действительно тонкая разница между '\ b \ w + \ b' и' \ w + ': первая требует границ с обеих сторон, где последняя не работает, и поэтому может возникать сложная смягчающая ситуация внутренняя часть строки, подобной '' peek'', как просто double-e. Первый не мог. Однако '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' и '' '' ** ** полностью перепутаны ** по отношению друг к другу, если вы не используете новый-в-Java-7 'UNICODE_CHARACTER_CLASS' или embedded' (? U) 'флаг шаблона шаблона. – tchrist