本博客只是用于个人知识梳理,如对大家有帮助也是万分荣幸。
题目描述
网站www.todayonhistory.com 能够显示历史上的今天发生的重要事件,还能够查询指定日期(某月某日)的历史事件。
在浏览器输入以下网址http://www.todayonhistory.com/10/15/ 能够查询10月15日的事件。
现要求开发一个Java控制台应用程序,运行时输入月份和日期之后,能够按照以下形式列出事件:
首先看到这个题目,根据老师给的网络读取的代码:
public static void main(String[] args) throws IOException {
URL url = new URL("http://www.cslg.cn/"); //创建URL
HttpURLConnection c = (HttpURLConnection)url.openConnection(); //创建连接
InputStream is = c.getInputStream(); //获得输入流
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); //创建Reader
String line;
while ((line = reader.readLine()) != null) { //读出所有文本行
System.out.println(line); //打印
}
reader.close(); //关闭Reader
}
看到这段代码,我先自己测试了一下,获得了整个网页的全部的代码。但是题目的要求是根据输入的日期来获得,同月同日发生的时间的列表。
通过解析我发现在给定的网页链接:http://www.todayonhistory.com/10/15/
最后的两位数字就可以获得对应时间发生的时间。可以通过设计两个变量来得到。
通过老师所指出的对应事件发生的规律,
可以看到,
是一个 标志,每出现一次该标志,则出现一条对应的事件。
对于每个事件:href之后引号里面的是该事件的详细网址;title之后引号内的是事件标题;src之后引号内的是图片网址;span标签之间的是事件发生日期。
那么我现在需要做的就是提取出对应的事件、时间、URL、imageUrl。
摆在我面前的提取方法有两种:
**1. 利用字符串搜索String.indexOf(…)和String.subString(..),可以依次解析每个事件的信息。
2. pattern和matcher类的使用**
字符串搜索:
通过对于字符串搜索的学习,发现分割字符串许多指导所对应的字符串所在的在位置。由于每一个事件对应的网址的长度是不一致的导致了无法定位对应时间URL的起始以及结束位置。关于String.indexOf(…)和String.subString(..)放面,我根据以下地址去学习的。String.indexOf(…)和String.subString(..)对应的学习地址
pattern&&matcher方法
首先使用的方法:
Pattern p = Pattern.compile("正则表达式");
Matcher m = p.matcher(Eventsloader());
int count=0;
while(m.find())//.find是判断下一个对应条件的pattern是否能读到。
里面正则表达式还是相当难写,一开始也摸不清怎么下手,也尝试了寻找自动生成正则表达式的小软件(后来发现全是徒劳)。只好仿造别人写:推荐一个网站:关于正则表达式如何处理的博客:正则表达式的书写方法
关于JAVA正则表达式 Pattern和Matcher可以参考一下这个博客所写的:
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。
> 1.简介:
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。 它包括两个类:Pattern和Matcher
。Pattern: 一个Pattern是一个正则表达式经编译后的表现模式。
Matcher: 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。
首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。
以下我们就分别来看看这两个类:
> 2.Pattern类: Pattern的方法如下:
static Pattern compile(String regex) 将给定的正则表达式编译并赋予给Pattern类
static Pattern compile(String regex, int flags)
同上,但增加flag参数的指定,可选的flag参数包括:CASE INSENSITIVE,MULTILINE,DOTALL,UNICODE
CASE, CANON EQ int flags() 返回当前Pattern的匹配flag参数. Matcher
matcher(CharSequence input) 生成一个给定命名的Matcher对象 static boolean
matches(String regex, CharSequence input)
编译给定的正则表达式并且对输入的字串以该正则表达式为模开展匹配,该方法适合于该正则表达式只会使用一次的情况,也就是只进行一次匹配工作,因为这种情况下并不需要生
成一个Matcher实例。 String pattern() 返回该Patter对象所编译的正则表达式。 String[]
split(CharSequence input) 将目标字符串按照Pattern里所包含的正则表达式为模进行分割。
String[] split(CharSequence input, int limit)
作用同上,增加参数limit目的在于要指定分割的段数,如将limi设为2,那么目标字符串将根据正则表达式分为割为两段。一个正则表达式,也就是一串有特定意义的字符,必须首先要编译成为一个Pattern类的实例,这个Pattern对象将会使用matcher()方法来生成一个Matcher实例,接着便可以使用该
Matcher实例以编译的正则表达式为基础对目标字符串进行匹配工作,多个Matcher是可以共用一个Pattern对象的。现在我们先来看一个简单的例子,再通过分析它来了解怎样生成一个Pattern对象并且编译一个正则表达式,最后根据这个正则表达式将目标字符串进行分割:
import java.util.regex.*; public class Replacement{ public static
void main(String[] args) throws Exception { //
生成一个Pattern,同时编译一个正则表达式 Pattern p = Pattern.compile(“[/]+”);
//用Pattern的split()方法把字符串按”/”分割 String[] result = p.split( “Kevin has
seen《LEON》seveal times,because it is a good film.”
+”/ 凯文已经看过《这个杀手不太冷》几次了,因为它是一部”
+”好电影。/名词:凯文。”); for (int i=0; i