Требуется помощь по регулярному выражению - PullRequest
1 голос
/ 06 октября 2010

Я пытаюсь заменить два или более вхождения тегов <br/> (например, <br/><br/><br/>) вместе с двумя <br/><br/> следующим шаблоном

Pattern brTagPattern = Pattern.compile("(<\\s*br\\s*/\\s*>\\s*){2,}", 
     Pattern.CASE_INSENSITIVE | Pattern.DOTALL);

Но в некоторых случаях '*Теги 1007 * 'поставляются с пробелом и заменяются тегами 4 <br/>, которые фактически должны были быть заменены всего двумя тегами.

Что я могу сделать, чтобы игнорировать 2 или 3 (несколько) пробелов, которыевстать между тегами?

Ответы [ 3 ]

1 голос
/ 06 октября 2010

Возможно, это не тот ответ, который вы хотите услышать, но, как правило, не стоит пытаться анализировать XML / HTML с помощью регулярных выражений.Так много вещей может пойти не так - гораздо лучше использовать библиотеку синтаксического анализа, специально предназначенную для таких данных, которая также полностью обойдет проблему, с которой вы столкнулись.

Взгляните на JAXB если вы уверены, что ваш HTML - это правильно сформированный XML, или если HTML, вероятно, является беспорядочным и несовместимым (как и большинство реальных HTML), вам следует попробовать что-то вроде TagSoup .

1 голос
/ 06 октября 2010

Вот некоторый Groovy-код для проверки вашего паттерна:

import java.util.regex.*

Pattern brTagPattern = Pattern.compile( "(<\\s*br\\s*/\\s*>\\s*){2,}", Pattern.CASE_INSENSITIVE | Pattern.DOTALL )
def testData = [
  ['',                            ''],
  ['<br/>',                       '<br/>'],
  ['< br/> <br />',               '<br/><br/>'],
  ['<br/> <br/><br/>',            '<br/><br/>'],
  ['<br/>   < br/ > <br/>',       '<br/><br/>'],
  ['<br/> <br/>   <br/>',         '<br/><br/>'],
  ['<br/><br/><br/> <br/><br/>',  '<br/><br/>'],
  ['<br/><br/><br/><b>w</b><br/>','<br/><br/><b>w</b><br/>'],
 ]

testData.each { inputStr, expected ->
  Matcher matcher = brTagPattern.matcher( inputStr )
  assert expected == matcher.replaceAll( '<br/><br/>' )
}

И все вроде бы нормально ...

0 голосов
/ 08 октября 2010

Вы можете сделать это, немного изменив свое регулярное выражение:

Pattern brTagPattern = Pattern.compile("<\\s*br\\s*/\\s*>\\s*<\\s*br\\s*/\\s*>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);

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

Pattern brTagPattern = Pattern.compile("<\\s*br\\s*/\\s*>(\\s){2,3}<\\s*br\\s*/\\s*>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...