为多个模式解析InputStream

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.

Ala*_*ore 5

你的意思是你想将任何<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


qwe*_*rty 0

Scanner.useDelimiter (Pattern) API 似乎就是您正在寻找的。您必须使用 OR (|) 分隔的模式字符串。

不过,这种模式很快就会变得非常复杂。