Java Regex или анализатор XML? - PullRequest
       0

Java Regex или анализатор XML?

3 голосов
/ 03 февраля 2012

Я хочу удалить любые теги, такие как

<p>hello <namespace:tag : a>hello</namespace:tag></p>

стать

 <p> hello hello </p>

Каков наилучший способ сделать это, если по какой-то причине это регулярное выражение?

(<|</)[:]{1,2}[^</>]>

редактирование: добавлено

Ответы [ 4 ]

3 голосов
/ 03 февраля 2012

Вы не должны использовать регулярные выражения для этих целей, используйте парсер типа lxml или BeautifulSoup

>>> import lxml.html as lxht
>>> myString = '<p>hello <namespace:tag : a>hello</namespace:tag></p>'
>>> lxht.fromstring(myString).text_content()
'hello hello'

Вот причина почему вы не должны анализировать html / xml с регулярным выражением.

3 голосов
/ 03 февраля 2012

Определенно используйте синтаксический анализатор XML. Regex не должен использоваться для разбора * ML

2 голосов
/ 03 февраля 2012

Если вы просто пытаетесь извлечь простой текст из простого XML, лучшим (самым быстрым и наименьшим объемом памяти) будет просто запустить цикл for для данных:

PSEUDOCODE НИЖЕ

bool inMarkup = false;
string text = "";
for each character in data // (dunno what you're reading from)
{
    char c = current;
    if( c == '<' ) inMarkup = true;
    else if( c == '>') inMarkup = false;
    else if( !inMarkup ) text += c;
}

Примечание: это сломается, если вы столкнетесь с такими вещами, как CDATA, JavaScript или CSS при разборе.

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

0 голосов
/ 13 мая 2014

Это решение, которое я лично использовал для решения аналогичной проблемы в Java. Для этого используется библиотека Jsoup: http://jsoup.org/.

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

  public static String unWrapTag(String html, String tagName, String attribute, String matchRegEx) {
    Validate.notNull(html, "html must be non null");
    Validate.isTrue(StringUtils.isNotBlank(tagName), "tagName must be non blank");
    if (StringUtils.isNotBlank(attribute)) {
      Validate.notNull(matchRegEx, "matchRegEx must be non null when an attribute is provided");
    }    
    Document doc = Jsoup.parse(html);
    OutputSettings outputSettings = doc.outputSettings();
    outputSettings.prettyPrint(false);
    Elements elements = doc.getElementsByTag(tagName);
    for (Element element : elements) {
      if(StringUtils.isBlank(attribute)){
        element.unwrap();
      }else{
        String attr = element.attr(attribute);
        if(!StringUtils.isBlank(attr)){
          String newData = attr.replaceAll(matchRegEx, "");
          if(StringUtils.isBlank(newData)){
            element.unwrap();
          }
        }        
      }
    }
    return doc.html();
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...