正则表达式 深入浅出2--从java API开始
前言之前一直想要做一个自己的爬虫,然后从nba数据相关的网上【虎扑,腾讯,官网等,要视网站是否支持】爬点数据写数据分析和图形化展示。虽然年轻的时候就实现过这个功能,但是当时直接借用了一个网上现成的jar包,然后在那个基础上写了一个非常简陋的正则表达式来提取数据。这次打算自己用JAVA API写一个爬虫,里面除了能读取HTML或是JSON或是XML,还要能够相应的支持多线程【这个功能将最后完成】。 进阶的正则表达式关于正则表达式的基本知识请参考我的博客正则表达式 深入浅出1--你的符号我做主【持续更新中 其它符号在博客1中,我将最常用的一些符号整理出来,这里再说一些还需要了解的符号。 字符
字符类
边界匹配符
这里新添的两个定界符有点难理解。我们已知 那么,在大多数情况下,我们都会通过词的边界符来实现获取而不是进行判断。 量词量词描述了一个模式吸收输入文本的方式。量词总共分为三种,贪婪型、勉强型和占有型。下面分别介绍这三种量词以便更好的构建正则表达式。 贪婪型
在默认情况下的一般正则表达式都是贪婪型的。 勉强型
占有型
下面举一个例子来说明这些情况: 输入的字符串: Pattern和Matcher API在Java中,和正则表达式最息息相关的两个类就是 创建正则表达式并判断字符流是否符合。 Pattern pattern = Pattern.compile("正则表达式"); Matcher matcher = pattern.matcher("等待匹配的字符");//这里可以输入任何继承了CharSequence的类 matcher.matches();//返回一个boolean值说明是否匹配 这里需要注意的是,Pattern和Matcher均不允许通过构造器新建一个对象。不仅如此,Pattern类是相对而言线程安全的,而Matcher类不是如此。 Pattern类构造器 static Pattern compile(String regex) static Pattern compile(String regex,int flag); 第二个构造pattern的方法中多了一个flag参数,这个参数允许我们定义pattern的模式,这里讲几个比较重要的模式:
如果希望有多个Pattern,可以输入 分割 String[] split(CharSequences c,int limit) String[] split(CharSequences c) 分组 Matcher类查找 int groupCount() //返回除了第0组的总分组数 boolean find() //从当前下标开始匹配,如果存在满足正则表达式的值,则返回true boolean find(int i)//从下标i开始匹配,如果存在满足正则表达式的值,返回true String group() //返回前一次匹配的第0个分组的内容 String group(int i)//返回前一次匹配的第i个分组的内容 int start() //返回上一次匹配成功的内容的起始下标 int end() //返回上一次匹配成功的内容的终止下标+1 举个栗子 Pattern p = Pattern.compile("<.*?>"); Matcher matcher = p.matcher("<tr>data</tr>"); while(matcher.find()){ System.out.println(matcher.group()); //先后输出<tr> </tr> } 替换 void replaceFirst(String replacement); void replaceAll(String replacement); void appendReplacement(StringBuffer s,String replacement); void appendTail(StringBuffer s); 这里讲一下appendReplacement和appendTail方法。appendReplacement允许开发者在替换的过程中针对将被替换的内容进行一些动态的操作。这个方法将逐步推进的向前替换,并将替换的结果添加到输入的s中。除此以外,对于没有被扫描到的部分,可以通过appendTail方法添加到输入的s中。 例子: Pattern p = Pattern.compile("hello",Pattern.CASE_INSENSITIVE); Matcher m = p.matcher("hello world one hello world 2"); StringBuffer s = new StringBuffer(); while(m.find()){ m.appendReplacement(s,m.group().toUpperCase()); System.out.println(s); } m.appendTail(s); System.out.println(s); 输出为:
小结其实正则表达式的适用范围非常广,除了和CharSequence配合使用之外,还可以和JAVA I/O如Scanner类,InputReader类等联合使用。核心还是在于Pattern类和Matcher类的组合使用。 References
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |