Java Scanner&正则表达式:两次应用findWithinHorizo​​n不会返回任何结果

时间:2012-07-13 05:47:24

标签: java regex java.util.scanner

我有以下代码,目标是使用正则表达式检测给定网页的编码/字符集。

我需要测试以下两个正则表达式(regexHTML1regexHTML2)。 在这种情况下,正确的正则表达式是第二个regexHTML2 ,输出:

Found: <meta id="HtmlHead1_desc" name="description" content="Televisores,TV 3D, TV, vídeo e MP3. Compre online Televisores,TV 3D na Fnac" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta
Found: UTF-8

使用此代码:

URL url = new URL("http://www.fnac.pt/imagem-e-som/TV-3D/Televisores/s21075?bl=HGAChead");
is = url.openStream();

String regexHTML1 = "<meta.*content=\\\".*;.*charset=(.*)\\\"\\s*/?>";
String regexHTML2 = "<meta.*content=\\\".*;.*charset=(.*)\\\"\\s*/?>\\s*<meta";

//  Scanner s = new Scanner(is);        
//  s.findWithinHorizon(regexHTML1, 0);
//  MatchResult result = s.match();
//  for (int i = 0; i <= result.groupCount(); i++)
//      System.out.println("Found: " + result.group(i));
//  s.close();

Scanner s2 = new Scanner(is);
s2.findWithinHorizon(regexHTML2, 0);
MatchResult result2 = s2.match();
for (int i = 0; i <= result2.groupCount(); i++)
    System.out.println("Found: " + result2.group(i));
s2.close();

但是,如果我取消注释测试第一个正则表达式(regexHTML1)的注释代码块,则输出为:

Found: <meta id="HtmlHead1_desc" name="description" content="Televisores,TV 3D, TV, vídeo e MP3. Compre online Televisores,TV 3D na Fnac" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta http-equiv="PICS-Label" content="(PICS-1.1 &quot;http://www.rsac.org/ratingsv01.html&quot; l gen true comment &quot;RSACi North America Server&quot; by &quot;webmaster@fnac.com&quot; for &quot;http://www.fnac.com/&quot; on &quot;1997.06.30T14:21-0500&quot; r (n 0 s 0 v 0 l 0))" /><link rel="shortcut icon" href="/favicon.ico" /><link id="HtmlHead1_canonicalLink" rel="canonical" href="http://www.fnac.pt/imagem-e-som/TV-3D/Televisores/s21075" />
Found: UTF-8" /><meta http-equiv="PICS-Label" content="(PICS-1.1 &quot;http://www.rsac.org/ratingsv01.html&quot; l gen true comment &quot;RSACi North America Server&quot; by &quot;webmaster@fnac.com&quot; for &quot;http://www.fnac.com/&quot; on &quot;1997.06.30T14:21-0500&quot; r (n 0 s 0 v 0 l 0))" /><link rel="shortcut icon" href="/favicon.ico" /><link id="HtmlHead1_canonicalLink" rel="canonical" href="http://www.fnac.pt/imagem-e-som/TV-3D/Televisores/s21075

由于regexHTML1不合适。但是在测试regexHTML2(正确的)时会引发异常:

java.lang.IllegalStateException: No match result available

这怎么可能? regexHTML2仅在我未测试regexHTML1 ...

时有效

2 个答案:

答案 0 :(得分:1)

输入流在读取时被消耗(即,它们知道它们的当前位置)。因此,由于您使用的是相同的流,因此初始扫描操作会消耗该流,并且第二个扫描程序不会留下任何内容。

使用两个不同的流,或将整个流下载到String或类似的内容中,并与之匹配。

答案 1 :(得分:0)

可能与inputStream有关,请你使用两个输入流is1和is2来检查。