Java 扫描器和正则表达式 : Applying findWithinHorizon twice returns no results

标签 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 时才有效...

最佳答案

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

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

关于Java 扫描器和正则表达式 : Applying findWithinHorizon twice returns no results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11464823/

相关文章:

java - 如何关闭用户 session /身份验证。在 Spring OAuth2 中为用户/客户端发送访问 token 后的上下文

java - 使用 Java 解压缩多部分 zip 文件卷

regex - 在 Emacs 中,如何使用 align-regexp 将 <- 和 = 对齐

javascript - 在正则表达式方法中使用变量,无法使其工作

java - 对于整数来说,什么相当于 isEmpty() ?

java - 由于 nextInt() 导致的 java.util.NoSuchElementException 类型的异常

java - 解析文本文件中的各种值(Java)

java - "this"指向什么?

java - 将数字格式化为货币并存储为整数

javascript - 无法在屏蔽的电话号码中通过退格键删除