我有以下代码,目标是使用正则表达式检测给定网页的编码/字符集。
我需要测试以下两个正则表达式(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
...
答案 0 :(得分:1)
输入流在读取时被消耗(即,它们知道它们的当前位置)。因此,由于您使用的是相同的流,因此初始扫描操作会消耗该流,并且第二个扫描程序不会留下任何内容。
使用两个不同的流,或将整个流下载到String
或类似的内容中,并与之匹配。
答案 1 :(得分:0)
可能与inputStream有关,请你使用两个输入流is1和is2来检查。