我有以下代码,其目的是使用正则表达式检测给定网页的编码/字符集。
我需要测试以下两个正则表达式(regexHTML1
和 regexHTML2
)。 在这种情况下,正确的正则表达式是第二个,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 "http://www.rsac.org/ratingsv01.html" l gen true comment "RSACi North America Server" by "webmaster@fnac.com" for "http://www.fnac.com/" on "1997.06.30T14:21-0500" 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 "http://www.rsac.org/ratingsv01.html" l gen true comment "RSACi North America Server" by "webmaster@fnac.com" for "http://www.fnac.com/" on "1997.06.30T14:21-0500" 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/