Java正则表达式还是XML解析器?

Java正则表达式还是XML解析器?,java,regex,xml-parsing,Java,Regex,Xml Parsing,我想删除任何标记,例如 <p>hello <namespace:tag : a>hello</namespace:tag></p> 你好你好 成为 <p> hello hello </p> 你好你好 如果出于某种原因这是正则表达式,那么最好的方法是什么呢 (<|</)[:]{1,2}[^</>]> (一定要使用XML解析器。出于这些目的,不应该使用正则表达式,而应该使用类似或的解析器

我想删除任何标记,例如

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

成为

 <p> hello hello </p>
你好你好

如果出于某种原因这是正则表达式,那么最好的方法是什么呢

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

(一定要使用XML解析器。

出于这些目的,不应该使用正则表达式,而应该使用类似或的解析器

>>将lxml.html导入为lxht
>>>myString='你好你好

' >>>lxht.fromstring(myString).text\u content() “你好”

以下是您不应该使用正则表达式解析html/xml的原因。

如果您只是试图从一些简单的xml中提取纯文本,最好(最快、最小的内存占用)就是在数据上运行for循环:

下面的伪代码

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;
}
bool-inMarkup=false;
字符串文本=”;
对于数据中的每个字符/(不知道从中读取的内容)
{
char c=电流;
如果(c='')inMarkup=false;
如果(!inMarkup)text+=c,则为else;
}
注意:如果在解析过程中遇到诸如CDATA、JavaScript或CSS之类的内容,这将中断


因此,总而言之……如果简单,请执行上面的操作,而不是正则表达式。如果没有那么简单,请听其他人的建议,并使用高级解析器。

这是我个人用于解决java中类似问题的解决方案。用于此的库是Jsoup:

在我的特殊情况下,我必须打开具有特定值属性的标记。您可以看到,这反映在这段代码中,它不是这个问题的确切解决方案,但可能会让您走上正轨

  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();
  }

直接链接:@LouisWasserman:我刚刚添加了这个链接。这个答案是标准的。@sln使用了“如”和“什么是最好的方式”等术语应该表明他不是在寻找一个具体的解决方案,而是一个更一般的解决方案。我把你的评论标记为非建设性的。@真正的鲍曼-如果OP没有使用明确的例子来说明他的问题,我会同意你的意见。他并不是在寻找一般的xml正则表达式解析的赞成/反对意见。如果你不想让我这么做的话很遗憾,我将转到其他地方。@sln我想让您注意这个问题本身,它是“Java正则表达式还是XML解析器?”这个问题的正确答案确实是“XML解析器”。他没有具体说明他是从流中读取还是仅从字符串读取,或者他的内容是否包含CDATA或类似内容,因此部分答案会有所不同。我只是提供了一个简单的解决方案,涵盖了问题域的一大部分。感谢批评。+1-抱歉,我的不好。请进行伪编辑,以便我的向上投票可以计数。+1-我的mi赌注。我只是想看看解决方案,而不是标准的“不使用正则表达式进行xml解析”,你的解决方案已经有了,抱歉!我尝试过了,但它希望你在它将我的投票逆转为向上投票之前对其进行编辑。只需进行伪编辑,我的向上投票将被启用。我稍后再检查。
  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();
  }