正则表达式

1,201 阅读5分钟

引言:更多相关请看 Java其它
注意:关于正则表达式了解即可,不会用没关系,直接去www.sojson.com/regex/gener…类似的网站进行查询即可。

概述:复杂的文本处理。一种强大灵活的文本处理工具,大部分编程语言、文本编译器、数据库、开发环境都支持。
定义:描述一类规则,通过这个规则可匹配一类字符串。
使用流程:

分析要匹配的数据,写出测试的典型数据。
在软件工具中进行测试。
在程序中调用通过测试的代码。

RegexBuddy

概述:就是一个正则表达式的工具,请自行学习使用方法。匹配的字符会以黄蓝色分隔。

字符类型

普通字符:字母、数字、汉字、下划线、没有特殊定义的标点符号。

普通转义字符

一些特殊符号,需要转义才能使用。

字符 说明
\n 换行符
\t 制表符
\ \
^ ,$,.,(, ) , {, } , ? , + , * , | ,[, ] 匹配字符本身

标准转义字符

概述:能与多种字符匹配的表达式。

字符 说明
\d 0-9
\w 任意字母数字下划线:0-9、a-z、A-Z、_
\s 空格符、换行符、制表符等任意空百字符。
. 匹配除换行符以外的任意字符。
[\s\S] 匹配所有任意字符。

注意:大小写区别严格,大写是相反的意思。 以\w的大小写为例: 小写:

大写:

自定义转义字符集

概述:能匹配方括号[]的表达式。

字符 说明
[14zc] 能匹配1、4、z、c等4个字符中任意一个字符。
[^a4] ^代表取反,能匹配除a、4以外任意一个字符。
[3-6] -代表多少到多少,能匹配3到六之间的任意数字。
[^1-4a-c] 能匹配1到4、a到c之间的任意字符数字。

注意:方括号内,正则表达式的特殊符号(除^、-【中划线】外)都是失去特殊意义。 标准字符集合(除小数点外),如被包含于中括号,自定义字符集合会把该集合包含。举例:[\d.-+]匹配:数字、.、+、-。 示例:

[1-5a-z]

示例:

[^1-5a-z]

量词Quantifier

概述:大括号内添加数字表示匹配次数。

字符 说明
{m} 能匹配m次。
{m,n} 能匹配次数大于等于m,小于等于n。
{m,} 能匹配至少m次(大于等于m)。
? {0,1}
+ {1,}
* {0,}

注意:量词不能这样写:{,8}。
比如:\d\d\d和\d{3}都代表匹配三位数字;\d\d{4}代表匹配5位数字;(\d\d\d){5,10}代表可匹配15位或30位数字。
示例:

贪婪匹配

默认,匹配字符越少越好。

非贪婪匹配

需要在修饰量词后面加一个“?”号,匹配字符越少越好。

字符边界

代表的是字符内容不是位置(它们是0宽度的)。

字符 说明
^ 从内容头开始匹配,匹配1次。
$ 从内容尾开始匹配,匹配1次。
\b 匹配单词边界。

说明:\b匹配的前后两边都不全是\w(匹配字母数字_)。
实例:

^:内容开始是要匹配的内容才符合,反之就不匹配($与它类似)。  

示例2:

\b

扩展:匹配模式

无视大小写:点击RegexBuddy的红色位置即可(大小写敏感)。

点击后,就能无视大小写了。
单行模式:(默认,之前将的就是单行)整个文本看作一个字符串,只有一个开头和结尾。让小数点"."可匹配包含换行符(\n)在内的任意字符。
多行模式:每行单独一个字符串,都有一个开头和结尾。在指定多行模式后,如需要仅匹配字符串开始和结束位置,可使用\A和\Z。
多行模式需要点击下图红框进行开启。
示例:
加\A和\Z

选择符和分组

分类:

|分支结果:或,匹配表达式左边或右边的结果。比如3|8代表可匹配3和8。
()捕获组:
    (1).被修饰匹配次数时,括号中的表达式可作为整体被修饰。
    (2).取匹配结果候,括号中表达式匹配到的内容可被单独得到。
    (3).每一对括号会分配一个编号,根据左括号的顺序从1开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本。
(?:expression)非捕获组:当不得不使用匹配(),又不想获取子表达式的结果时,可以使用非捕获组。
反向作用(\nnn):通过对成功捕获到的左括号的编号进行引用。

示例:

零宽断言

概述:(环视/预搜索)表示匹配的前后面能或不能出现什么。
分类:

(?=exp):表示匹配位置的后面能匹配exp。
(?<=exp):表示匹配位置的前面能匹配exp。
(!=exp):表示匹配位置的后面不能匹配exp。
(!<=exp):表示匹配位置的前面不能匹配exp。

以(?=exp)示例(其它差不多):只有数字后面有字母才被匹配。

编译器或开发环境中使用正则

以notepad++和idea为例。
Notepad++:ctrl+f选择正则表达式查找模式即可。

Idea:也是使用ctrl+f勾选Regex填写正则表达即可。

Java中使用正则

Java中提供Pattern(正则表达式)和Matcher(匹配内容)两个类来处理正则表达式,具体事例如下:

class TestRegex {
    public static void main(String[] args){
        //注意\要转为\\才不会错
		/*Pattern p = Pattern.compile("\\d+");//填写正则表达式
		Matcher m = p.matcher("345454");//匹配内容
		System.out.println(m.matches());//true 把这个内容进行匹配
		System.out.println(m.find());// false 分段匹配*/
		/*Pattern p = Pattern.compile("([a-z]+)(\\d+)");
		Matcher m = p.matcher("asf45*dfsf4543#324dsfd");
		while(m.find()){
			//System.out.println(m.group());//m.group()和m.group(0)一一样
			System.out.println(m.group(1));
			System.out.println(m.group(2));//分组思想,打印的是把字母数字分开。
		}
		打印结果
		asf
		45
		dfsf
		4543
		*/
        //替换 (测试正则表达式的分割)
        String s = "dfgs4354dfs454xd45sd4se54";
        String[] arr = s.split("\\d+");//把数字去掉,只留字母
        //遍历
        System.out.println(Arrays.toString(arr));//[dfgs, dfs, xd, sd, se]
    }
}

练习

匹配电话号码和手机号码

电话号码:区号(0开头,后面是2到3位数字)加中划线加8位数字。
表达式:

0\d{2,3}-\d{8}

手机号码:1开头加第二位是3到9之间的数字、后面9位是任意数字。 表达式:

1[3456789]\d{9}

加|同时匹配手机号码加电话号码:

(0\d{2,3}-\d{8})|(1[3456789]\d{9})

匹配邮箱

概述:前面一般是任意位的字母(大小写)数字中划线加@加任意位的字母数字加“.”加3位的字母(小写)。 表达式:

[\w]+@[a-zA-Z0-9]+\.[a-z]{3}

爬虫

概述:爬取网站源码并且获取内容。

/**
 * 爬虫
 * 获取网页源码,并使用正则表达式找出我们想要的东西
 */
class TestSpider {
    public static void main(String[] args){
        String str = getSound("https://www.jd.com","utf-8");
        String regex = "(?<=(content=\\\"))(.+?)(?=\\\")";
        List<String> li = getRegex(str,regex);
        for(String s:li){
            System.out.println(s);
        }
    }
    //获取网站源码 content="网上购物,网上商城,家电,手机,电脑,服装,居家,母婴,美妆,个护,食品,生鲜,京东" /里面的内容
    public static List<String> getRegex(String str, String regex){//str目标字符串,regex正则表达式
        //容器
        List<String> li = new ArrayList<>();
        //正则表达式流程
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(str);
        while (m.find()) {
            li.add(m.group(2));//打印匹配内容
        }
        return li;
    }
    //获取网站源码
    public static String getSound(String srcUrl,String charsetName){
        //字符串
        StringBuilder sb = new StringBuilder();
        BufferedReader br = null;
        try {
            //路径
            URL url = new URL(srcUrl);
            //字符输入流 指定字符集
            br = new BufferedReader(new InputStreamReader(url.openStream(), Charset.forName(charsetName)));
            //IO操作
            String s="";
            while((s=br.readLine())!=null){
                sb.append(s);//加换行符 一行行读取
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sb.toString();//返回数据
    }
}

结果:

width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=yes
京东JD.COM-专业的综合网上购物商城,销售家电、数码通讯、电脑、家居百货、服装服饰、母婴、图书、食品等数万个品牌优质商品.便捷、诚信的服务,为您提供愉悦的网上购物体验!
网上购物,网上商城,手机,笔记本,电脑,MP3,CD,VCD,DV,相机,数码,配件,手表,存储卡,京东
IE=edge,chrome=1
webkit