Java正则表达式用于在标记之间提取内容

时间:2013-01-16 16:58:40

标签: java regex

输入:

<tag>Testing different formatting options in </tag><tag class="classA classB">Text</tag><tag class="classC">Class C text</tag>

预期输出:

<tag>Testing different formatting options in </tag><tagA><tabB>Text</tagA></tagB><tagC>Class C text</tag>

基本上,标签由基于“class”中属性的标签替换。即,如果属性具有classA属性,则标签将被tagA替换,如果classB属性也存在,那么标签也将包含tagB等等。

尝试:

    final String TAG_GROUPS = "<tag class=\"(.*)\">(.*)</tag>";
    Pattern pattern = Pattern.compile(TAG_GROUPS);
    Matcher matcher = pattern.matcher(inputString);

我得到的输出无法找到匹配的标签。特别声明

    String classes = matcher.group(1);

给出字符串classA classB">Text</tag><tag class="classC">Class C text</tag。模式匹配器无法找到匹配的标记。我是正则表达式的初学者,我想知道问题的正确模式。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:2)

你应该使用贪婪的正则表达式:"<tag class=\"(.*?)\">(.*)</tag>"。否则,.*会匹配任何字符,包括</tag>

但总的来说,我同意大家的看法,这不是使用正则表达式解析XML的最佳实践。请改用XML解析器。

答案 1 :(得分:1)

虽然您可以使用regexp来定位开始标记并解析类,但是无法生成嵌套标记作为输出。有关详细信息,请参阅this answer

你能做的就是编写自己的简单HTML解析器,但解析HTML时非常麻烦。换句话说:看看我的声誉,然后考虑在没有充分理由的情况下尝试它(比如有人向我支付了50万美元)。

使用真实的HTML解析器,例如HTML Tidy

答案 2 :(得分:1)

使用*时,它会尝试吸收所有可能的字符(贪婪)。

如果您希望.*匹配较少的字符,则必须使用与*?的懒惰匹配。

所以你的正则表达式得到:

<tag class=\"(.*?)\">(.*?)</tag>

以上,是简单的方法。但不是最佳方式。懒惰比贪婪更慢,如果可以的话,你必须尽量避免它。例如,如果您估计代码是正确的(没有标记符号而没有关闭标记等),那么使用否定类而不是.*?会更好。例如,你的正则表达式可以写成:

<tag class="([^"]*)">([^<]*)</tag>

Witch对正则表达式引擎更有效(尽管并不总是可以将延迟匹配转换为否定类)。

当然,如果你试图用巫婆解析完整的html或xml文档,你必须做很多不同的改动,最好使用xml(html)解析器。