输入:
<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
。模式匹配器无法找到匹配的标记。我是正则表达式的初学者,我想知道问题的正确模式。任何帮助表示赞赏。
答案 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)解析器。