ben*_*ben 5 java regex inputstream pattern-matching
我正在为某些模式解析一个InputStream以从中提取值,例如我会有类似的东西
<span class="filename"><a href="http://example.com/foo">foo</a>
Run Code Online (Sandbox Code Playgroud)
我不想使用完整的html解析器,因为我对文档结构不感兴趣,而只是在一些定义明确的信息中.(只有他们的顺序很重要)
目前我使用的是一种非常简单的方法,我为每个Pattern都有一个Object,其中包含一个打开和关闭'tag'的char [](在示例中打开将<span class="filename"><a href="关闭"以获取url )和位置标记.对于InputStream读取的每个字符,我迭代所有模式并调用match(char)一旦开始模式匹配时返回true 的函数,从那时起我在StringBuilder中收集以下字符,直到现在活动模式再次匹配().然后我调用一个具有Pattern和String读取ID的函数来进一步处理它.
虽然这在大多数情况下工作正常,但我想在模式中包含正则表达式,所以我也可以匹配类似的东西
<span class="filename" id="234217"><a href="http://example.com/foo">foo</a>
Run Code Online (Sandbox Code Playgroud)
在这一点上,我确信我会重新发明轮子,因为这肯定是以前完成的,而且我真的不想编写自己的正则表达式解析器.但是,我找不到任何可以做我想要的东西.
不幸的是,这个Scanner类只匹配一个模式,而不是模式列表,我可以使用哪些替代方案?它不应该很重,适用于Android.
你的意思是你想将任何<span>元素与给定的class属性的,而不管它可能具有的其他属性?这很容易:
Scanner sc = new Scanner(new File("test.txt"), "UTF-8");
Pattern p = Pattern.compile(
"<span[^>]*class=\"filename\"[^>]*>\\s*<a[^>]*href=\"([^\"]+)\""
);
while (sc.findWithinHorizon(p, 0) != null)
{
MatchResult m = sc.match();
System.out.println(m.group(1));
}
Run Code Online (Sandbox Code Playgroud)
文件“test.txt”包含您问题的文本,输出为:
http://example.com/foo 并关闭 http://example.com/foo