2019独角兽企业重金招聘Python工程师标准>>>
上一篇内容写了如何请求资源,那么资源请求下载之后我们就要对它就行解析了,解析之前我们先熟悉一下正则表达式
正则表达式在平常使用时还是很广泛的,比如说表单输入验证,验证手机号邮箱之类,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方法。