文档章节

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

Mr_river
 Mr_river
发布于 2016/01/07 11:10
字数 1183
阅读 6.8K
收藏 6

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

正则表达式在平常使用时还是很广泛的,比如说表单输入验证,验证手机号邮箱之类,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方法。




© 著作权归作者所有

Mr_river
粉丝 22
博文 14
码字总数 9772
作品 0
南京
私信 提问
加载中

评论(0)

《Kotin 极简教程》第15章 Kotlin 文件IO操作、正则表达式与多线程

第15章 Kotlin 文件IO操作与多线程 《Kotlin极简教程》正式上架: 点击这里 > 去京东商城购买阅读 点击这里 > 去天猫商城购买阅读 非常感谢您亲爱的读者,大家请多支持!!!有任何问题,欢迎...

程序员诗人
2017/07/24
0
0
第9章 文件IO操作、正则表达式与多线程

第9章 文件IO操作、正则表达式与多线程 我们在《第6章 扩展函数与属性》中已经介绍过Kotlin中的类扩展的特性。使用Kotlin的扩展函数功能,我们可以直接为 String 类实现一个 inc() 函数,这个...

程序员诗人
2017/10/18
0
0
Java 正则表达式功能及应用

正则表达式,就是用某种模式去匹配一类字符串的一个公式,正则表达式由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,不管是...

浮躁的码农
2015/07/29
0
0
java正则表达式对字符串的操作

学习java正则表达式的都知道,它的重要性;但同时也了解它的难度和复杂性。所以为了加深我们对它的了解。我举了几个例子: 例子1、 查找以Java开头,任意结尾的字符串 Pattern pattern = Patt...

goqin
2012/06/29
222
0
js和java中正则表达式的易混淆点

js中正则表达式的使用 对表单中的值进行正则表达式匹配一般有两种方法: var reg = new RegExp(regStr); reg.test(value); 如下: var reg = new RegExp(“\d{3}”); reg.test(“abc123def”...

绝影jy
2014/07/30
1.8K
0

没有更多内容

加载失败,请刷新页面

加载更多

activiti 工作流数据库表详细介绍(23张表)

Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。 ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和...

osc_2gaqqnhg
16分钟前
20
0
【Python3 爬虫】U34_selenium操作cookie

目录 1.示例代码 2.实战演练 1.示例代码 获取所有的cookie:for cookie in driver.get_cookies(): print(cookie) 根据cookie的key获取value: value = driver.get_cookie(key) 删...

osc_we9lokaj
18分钟前
14
0
【Python3 爬虫】U35_selenium隐式等待和显示等待

目录 1.隐式等待 2.显示等待 3.实战演练 3.1 隐式等待案例 3.2 显示等待案例 现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长...

osc_2wq8ft8d
19分钟前
24
0
一文读懂 K8s 持久化存储流程

作者 | 孙志恒(惠志) 阿里巴巴开发工程师<br /> **导读:**众所周知,K8s 的持久化存储(Persistent Storage)保证了应用数据独立于应用生命周期而存在,但其内部实现却少有人提及。K8s 内...

阿里巴巴云原生
20分钟前
23
0
为什么大公司一定要使用微服务?

作者:飒然Hang https://www.rowkey.me/blog/2019/05/30/msa/ 这几年在 Java 工程师招聘时,会看到很多人的简历都写着使用了 Spring Cloud 做微服务实现,使用 Docker 做自动化部署,并且也会...

Java技术栈
20分钟前
26
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部