2013-05-07 2 views
0

Предположим, что у меня есть эта строка java. Обратите внимание, что есть две пары <c></c>, одна содержит только числа, а другая содержит числа и строку. Как узнать, содержит ли строка <c></c> только цифры в Java? Я сделал это, но это не сработало.Как найти совпадение строк с регулярным выражением

String keyPattern = "^<id>[0-9]</id>$"; 
    boolean hasKey = str.matches(keyPattern); 

<start><a></a><b></b><c>addf123</c><d><d><c>1234</c><foo></foo><bar></bar></start> 
+1

В общем смысле, вы должны быть действительно анализировать данные должным образом с XML-анализатором. Разбор с использованием регулярного выражения - это неправильная вещь. – rolfl

+1

Пожалуйста, не используйте регулярное выражение для анализа XML. См. Http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

ответ

0

У вас есть пара ошибок.

  1. У вас нет тегов "< идентификатор>" или "</идентификатор>" внутри вашей строки, вы есть "</с>".
  2. Специальный символ «^» означает, что он должен совпадать с началом строки. «$» означает, что он должен соответствовать до конца строки. Поэтому в этом случае вы хотите совместить все, вплоть до «< c> цифр </c>», а затем сопоставить остальные. «. *» будет соответствовать всем до тех пор, пока вы не захотите, затем вам нужно найти цифры, а затем сопоставить остальную часть строки, используя «.*»
  3. Вы только поиск с одной цифрой с„[0-9]“Вы должны искать 1 или более, это делается с„+“символом

пересмотренной спичек, который работает.

String keyPattern = ".*<c>[0-9]+</c>.*"; 
boolean hasKey = str.matches(keyPattern); 
+0

Большое вам спасибо! это сработало – codereviewanskquestions

0

Вы были очень близки, вам нужно добавить «квантификатор». В вашем случае «+».

String keyPattern = "^<id>[0-9]+</id>$"; 

Ссылка на JavaDoc for Pattern

Edit: НО, вы только собираетесь успешно соответствовать строке, где только значения в строке являются "<id>123</id>" и никакого другого текста, потому что у вас есть^и $ anchors.

Итак, если вы удалите те, у вас есть:

String keyPattern = ".*<id>[0-9]+</id>.*"; 

который будет соответствовать любой строке, которая содержит номер-только ... тег в любом месте.

Я подозреваю, что вы хотите получить все идентификаторы с числовым значением, и в этом случае метод совпадений (...) не тот, который вы хотите использовать ... но это другая проблема.

+0

Этот ключPattern не будет соответствовать строке при использовании str.matches – greedybuddha

+0

@greedybuddha спасибо, brain-fart – rolfl

+0

никаких проблем, я вижу, вы уже исправили его в своем ответе! – greedybuddha

0

Если вы хотите, чтобы соответствовать строку, которая может содержать ряд любого размера вам нужно добавить + после [0-9], так это выглядит следующим образом:

[0-9]+ 

Как это сейчас он будет соответствовать только одному цифровому номеру.

-1

[0-9] будет соответствовать одна цифра

[0-9]? будет соответствовать 0 или 1 цифры

[0-9]* будет соответствовать 0 или больше цифр

[0-9]+ будет соответствовать 1 или много цифр

вы также можете заменить [0-9] на \d на цифру

0

не использовать регулярные выражения для разбора XML используйте реальный XML API, таких как SAX или DOM -.. или, если применимо, некоторые более высокого уровня API, который является менее утомительным для использования, например, если вы используете XML для сериализации объектов, вы должны посмотреть на JAXB.

Попытка сделать это с помощью регулярных выражений просто требует неприятностей. Показать похожие вопросы и ответы на них:

Why is it such a bad idea to parse XML with regex?

RegEx match open tags except XHTML self-contained tags

Смежные вопросы