0

输入 :

<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>

基本上,标签被基于“类”中的属性的标签替换。即,如果属性具有 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. 模式匹配器找不到匹配的标签。我是正则表达式的初学者,我想知道问题的正确模式。任何帮助表示赞赏。

4

3 回答 3

2

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

但总的来说,我同意人们的观点,即这不是使用正则表达式解析 XML 的最佳实践。请改用 XML 解析器。

于 2013-01-16T17:03:47.983 回答
1

虽然您可以使用正则表达式来定位开始标签并解析类,但无法生成嵌套标签作为输出。有关详细信息,请参阅此答案

您可以做的是编写自己的简单 HTML 解析器,但 HTML 解析起来非常混乱。或者换一种说法:看看我的声誉,然后考虑如果没有充分的理由(比如有人付给我一百万美元),不会尝试它。

请改用HTML Tidy等真正的 HTML 解析器。

于 2013-01-16T17:03:13.957 回答
1

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

如果你想让它.*匹配不太可能的字符,你必须使用惰性匹配*?

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

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

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

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

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

当然,如果您试图解析一个完整的 html 或 xml 文档,您必须进行许多不同的更改,最好使用 xml (html) 解析器。

于 2013-01-16T17:14:45.370 回答