Java简单爬虫系列(3)---正则表达式和Java正则API的使用

上一篇内容写了如何请求资源,那么资源请求下载之后我们就要对它就行解析了,解析之前我们先熟悉一下正则表达式

正则表达式在平常使用时还是很广泛的,比如说表单输入验证,验证手机号邮箱之类,Java的字符串匹配实现等都用到了正则,正则表达式的规则也不是很多,我简单写几种,如果你想详细的了解学习正则表达式,推荐阅读正则表达式30分钟入门教程,写的很全面,讲解的也很到位。

我要写的是使用过程

下面是一些常用的


元字符

  1. \b 用于单词的间隙处,\bhello\b表示匹配hello单词

  2. \d 匹配数字 0\d\d 表示匹配011,023,以0开头三位数字,还可以写成0\d{2},0后面两个数字

  3. .  匹配换行符以外的所有字符

  4. * 它前面的字符可以无限重复

  5. \s 任意的空白符 ,比如空格,TAB

  6. \w 字母或数字或下划线或汉字等

  7. + 和*类似,但是+至少一次,*可能0此

  8. ^ 字符串开始

  9. $ 字符串结束

  10. {5,12} 长度限制在5到12之间

  11. ? 重复0到1次

  12. [ ] 表示需要查找的内容,比如[aeiou]包含元音字母,[.?*]包含.?*的串

字符转义

  1. 用 \ 来转义元字符,比如要查找含*的串,\* == *

分支条件

  1. | 表示或,两个表达式连接 a|b,表示满足表达式a或者b

分组

  1. ()分组,可以把多个匹配放到一块,重复查找

反义

  1. \W\S\D\B把小写改成大写,[]里的加^,比如[^aeiou]不是元音字母

注释

  1. (?#comment) 对表达式进行注释,比如 2\d[0-2](?#200-292)   表示200-292之间的数字

贪婪与懒惰

  1. a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

  2. 在 . * ? {n,m}等后面加?则表示尽可能少的匹配,.? *? ?? {n,m}?

可能你看了上面还是不知道在说什么不要紧,下面写了java的正则API之后会举例说明

java.util.regex 包主要由三个类所组成:Pattern、Matcher 和 PatternSyntaxException。

Pattern 对象表示一个已编译的正则表达式。Pattern 类没有提供公共的构造方法。要构建一个模式,首先必须调用公共的静态 compile 方法,它将返回一个 Pattern 对象。这个方法接受正则表达式作为第一个参数。

Matcher 是一个靠着输入的字符串来解析这个模式和完成匹配操作的对象。与 Pattern 相似,Matcher 也没有定义公共的构造方法,需要通过调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

PatternSyntaxException 对象是一个未检查异常,指示了正则表达式中的一个语法错误。

使用的流程可以分为下面几个步骤

  1. Pattern的compile静态方法获取pattern对象

  2. pattern调用自身的matcher方法返回Matcher对象matcher

  3. matcher对象通过find,matches,lookingAt等方法进行匹配

下面是个示例,要找到匹配ae,be,de,he之中的任意一个

package com.hldh.river.regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by liuhj on 2016/1/5.
 * 本例用于测试JDK1.7 中的Matcher和Pattern
 *
 * 使用时主要是Pattern编译正则,Matcher用来匹配字符串
 */
public class AppTest {

    public static void main(String args[]){
        String regexStr = "[abdh]e";
        String targetStr = "hello world";
        //获取Pattern对象
        Pattern pattern = Pattern.compile(regexStr);
        // 定义一个matcher用来做匹配
        Matcher matcher = pattern.matcher(targetStr);
        if (matcher.find()) {
            System.out.println(matcher.group());
        }
    }

}

输出结果

he

是不是很简单,主要的难点还是在正则表达式的掌握上,API很好理解

还有一个点我觉得需要说明一下,就是group,正则表达式里有个分组的概念,比如说“^([abdh]e)(\d+)$”这里面就是两个分组,对应API里的group(int group),参数里是2的话就对应匹配(\d+),参数是1的话对应匹配([abdh]e),参数0是系统默认,表示匹配整个串。

使用group就可以把匹配到的字符窜捕获。

Matcher中find方法是匹配字符串中的一部分,matches匹配整个字符串,所以啊你看表单验证都是用的matches方法。




你可能感兴趣的:(正则表达式,Pattern,Matcher,java爬虫)