2013-04-03 3 views
-1

Я пытаюсь использовать регулярные выражения в Java для соответствия всей строке формы <b><number></b>, которые содержатся в паре <a><\a>.RegEx - сопоставить несколько пар тегов в родительском теге

например. <a> kljsdlk <b>123</b> df <b>345</b> sdfklj</a> должен совпадать дважды с <b>123</b> и <b>345</b>, а <v> kljsdlk <b>123</b> df <b>345</b> sdfklj</v> не должен иметь никаких результатов (потому что нет обертывания <a></a>).

Следующий код мой текущий лучший результат:

 Pattern MY_PATTERN = Pattern.compile("(<a>.*(<b>[0-9]*<\\\\b>)?.*<\\\\a>)"); 

    Matcher m = MY_PATTERN.matcher("<a> skdjlkasjflkj <b>200<\\b> sldfhjhfj d lkj b <b>300<\\b> fhih 9 09 <\\a>"); 
    while (m.find()) { 
     for (int i=0; i< m.groupCount() ;i++){ 
      String s = m.group(i); 
      System.out.println(s); 
     } 
    } 

Этот код результата с:

<a> skdjlkasjflkj <b>200<\b> sldfhjhfj d lkj b <b>300<\b> fhih 9 09 <\a> 
<a> skdjlkasjflkj <b>200<\b> sldfhjhfj d lkj b <b>300<\b> fhih 9 09 <\a> 

Я хотел бы, чтобы в результате:

<b>200<\b> 
<b>300<\b> 
+0

Не следует смешивать регулярное выражение с HTML. – hsz

+4

[Не пытайтесь анализировать HTML с регулярным выражением] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – Buggabill

+1

@StefanBeike - этот вопрос был - спросил очень много раз. Существуют чрезвычайно ограниченные случаи, когда разбор разметки с регулярным выражением может быть приемлемым. Тем не менее, вы играете с огнем. Одно из моих голосов было моим, и мои комментарии ссылаются на объяснение, которое использовалось здесь много-много раз. Лучше использовать любое количество доступных библиотек для выполнения обязанностей. – Buggabill

ответ

1

Почему не подстать <a>.*</a> первым, а затем искать <b>[0-9]*</b>?

Pattern p1 = Pattern.compile("(<a>.*</a>)"); 
    Pattern p2 = Pattern.compile("<b>\\d*</b>"); 
    Matcher m1 = m1 = p1.matcher("<a> kljsdlk <b>123</b> df <b>345</b> sdfklj</a>"); 
    if (m1.find()) { 
     Matcher m2 = p2.matcher(m1.group()); 
     while (m2.find()) { 
     System.out.println(m2.group()); 
     } 
    } 
+1

' * 'is * жадный *. –

+0

, но это именно то, что хотел. – YaOg

+1

@YaOg Жадность '*' работает для этого тривиального примера (как часто тривиальный пример совпадает с реальной средой ?!), но если в целевой строке есть более одного ' ...', тогда будут проблемы - в зависимости от цели. –

0

Проблема в том что вы сопоставили всю строку в шаблоне. Вы должны создать шаблон для внутреннего тега. Это обеспечит правильные совпадающие строки

+0

ОК. Но как я применяю ? – summerbulb

+0

Конечно, это прямолинейно. Вопрос в том, можно ли это сделать с использованием регулярного выражения. – summerbulb

+0

да, это может быть, но вам нужно использовать 2 регулярных выражения не один – MozenRath

0

Если Java поддерживает произвольные искажения, то вы можете может уметь это сделать. Без этого это невозможно в регулярном выражении. Кроме того, поскольку это HTML/XML, библиотека, предназначенная для таких, была бы более интуитивной в использовании.

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