您的位置:首页 > 编程语言 > Java开发

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

2016-01-07 00:00 513 查看
摘要: 上一篇内容写了如何请求资源,那么资源请求下载之后我们就要对它就行解析了,解析之前我们先熟悉一下正则表达式

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

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

我要写的是使用过程

下面是一些常用的

元字符

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

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

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

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

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

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

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

^ 字符串开始

$ 字符串结束

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

? 重复0到1次

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

字符转义

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

分支条件

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

分组

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

反义

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

注释

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

贪婪与懒惰

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

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

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

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

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

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

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

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

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

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

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方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息