恭喜你,Get到一份 正则表达式 食用指南
先赞后看,养成习惯

前言
正则表达式
正则表达式: 定义一个搜索模式的字符串。
正则表达式可以用于搜索、编辑和操作文本。
正则对文本的分析或修改过程为:首先正则表达式应用的是文本字符串(text/string),它会以定义的模式从左到右匹配文本,每个源字符只匹配一次。
Java中正则表达式的使用
字符串内置正则
在 Java 中有四个内置的运行正则表达式的方法,分别是 matches()、split())、replaceFirst()、replaceAll()。注意 replace() 方法不支持正则表达式。
| 方法 | 描述 | 
|---|---|
| s.matches("regex") | 当仅且当正则匹配整个字符串时返回 true | 
| s.split("regex") | 按匹配的正则表达式切片字符串 | 
| s.replaceFirst("regex", "replacement") | 替换首次匹配的字符串片段 | 
| s.replaceAll("regex", "replacement") | 替换所有匹配的字符 | 
示例代码
 System.out.println("lby".matches("lby"));
	        System.out.println("----------");
	        String[] array = "l b y".split("\\s");
	        for (String item : array) {
	            System.out.println(item);
	        }
	        System.out.println("----------");
	        System.out.println("l b y".replaceFirst("\\s", "-"));
	        System.out.println("----------");
	        System.out.println("l b y".replaceAll("\\s", "-"));
运行结果
true
----------
l
b
y
----------
l-b y
----------
l-b-y
regex包
java.util.regex 包主要包括以下三个类:
- Pattern 类 - pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。 
- Matcher 类 - Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。 
- PatternSyntaxException - PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。 
Java 中regex 包使用正则表达式基本步骤
- 通过正则表达式创建模式对象 Pattern。
 
- 通过模式对象 Pattern,根据指定字符串创建匹配对象 Matcher。
 
- 通过匹配对象 Matcher,根据正则表达式操作字符串。
 
例如
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestRegex {
	public static void main(String[] args) {
		//定义一个字符串
		String text = "Hello Regex!";
		//创建一个Pattern对象  可以认为根据正则表达式获取一个对应的对象
        Pattern pattern = Pattern.compile("\\w+");
        // Java 中忽略大小写,有两种写法:
        // Pattern pattern = Pattern.compile("\\w+", Pattern.CASE_INSENSITIVE);
        // Pattern pattern = Pattern.compile("(?i)\\w+"); // 推荐写法
        Matcher matcher = pattern.matcher(text);
        // 遍例所有匹配的序列
        while (matcher.find()) {
            System.out.print("Start index: " + matcher.start());
            System.out.print(" End index: " + matcher.end() + " ");
            System.out.println(matcher.group());
        }
	}
}
运行的结果为:
Start index: 0 End index: 5 Hello
Start index: 6 End index: 11 Regex、
以上代码看不懂没有关系,提前感受一下正则的神奇,接下来我们学习一下正则表达式的的语法。
正则表达式的语法
常见匹配符号
| 正则表达式 | 描述 | 
|---|---|
| . | 匹配所有单个字符,除了换行符(Linux 中换行是 \n,Windows 中换行是\r\n) | 
| ^regex | 正则必须匹配字符串开头 | 
| regex$ | 正则必须匹配字符串结尾 | 
| [abc] | 复选集定义,匹配字母 a 或 b 或 c | 
| [abc][vz] | 复选集定义,匹配字母 a 或 b 或 c,后面跟着 v 或 z | 
| [^abc] | 当插入符 ^在中括号中以第一个字符开始显示,则表示否定模式。此模式匹配所有字符,除了 a 或 b 或 c | 
| [a-d1-7] | 范围匹配,匹配字母 a 到 d 和数字从 1 到 7 之间,但不匹配 d1 | 
| XZ | 匹配 X 后直接跟着 Z | 
| X|Z | 匹配 X 或 Z | 
元字符
元字符是一个预定义的字符。
| 正则表达式 | 描述 | 
|---|---|
| \d | 匹配一个数字,是 [0-9]的简写 | 
| \D | 匹配一个非数字,是 [^0-9]的简写 | 
| \s | 匹配一个空格,是 [ \t\n\x0b\r\f]的简写 | 
| \S | 匹配一个非空格 | 
| \w | 匹配一个单词字符(大小写字母、数字、下划线),是 [a-zA-Z_0-9]的简写 | 
| \W | 匹配一个非单词字符(除了大小写字母、数字、下划线之外的字符),等同于 [^\w] | 
限定符
限定符定义了一个元素可以发生的频率。
| 正则表达式 | 描述 | 举例 | 
|---|---|---|
| * | 匹配 >=0 个,是 {0,}的简写 | X*表示匹配零个或多个字母 X,.*表示匹配任何字符串 | 
| + | 匹配 >=1 个,是 {1,}的简写 | X+表示匹配一个或多个字母 X | 
| ? | 匹配 1 个或 0 个,是 {0,1}的简写 | X?表示匹配 0 个或 1 个字母 X | 
| {X} | 只匹配 X 个字符 | \d{3}表示匹配 3 个数字,.{10}表示匹配任何长度是 10 的字符串 | 
| {X,Y} | 匹配 >=X 且 <=Y 个 | \d{1,4}表示匹配至少 1 个最多 4 个数字 | 
| *? | 如果 ?是限定符*或+或?或{}后面的第一个字符,那么表示非贪婪模式(尽可能少的匹配字符),而不是默认的贪婪模式 | 
分组和反向引用
小括号 () 可以达到对正则表达式进行分组的效果。
模式分组后会在正则表达式中创建反向引用。反向引用会保存匹配模式分组的字符串片断,这使得我们可以获取并使用这个字符串片断。
在以正则表达式替换字符串的语法中,是通过 $ 来引用分组的反向引用,$0 是匹配完整模式的字符串(注意在 JavaScript 中是用 $& 表示);$1 是第一个分组的反向引用;$2 是第二个分组的反向引用,以此类推。
示例:
package com.baizhi.test;
public class RegexTest {
    public static void main(String[] args) {
        // 去除单词与 , 和 . 之间的空格
        String Str = "Hello , World .";
        String pattern = "(\\w)(\\s+)([.,])";
        // $0 匹配 `(\w)(\s+)([.,])` 结果为 `o空格,` 和 `d空格.`
        // $1 匹配 `(\w)` 结果为 `o` 和 `d`
        // $2 匹配 `(\s+)` 结果为 `空格` 和 `空格`
        // $3 匹配 `([.,])` 结果为 `,` 和 `.`
        System.out.println(Str.replaceAll(pattern, "$1$3")); // Hello, World.
    }
}
上面的例子中,我们使用了 [.] 来匹配普通字符 . 而不需要使用 [\\.]。因为正则对于 [] 中的 .,会自动处理为 [\.],即普通字符 . 进行匹配。
否定先行断言(Negative lookahead)
我们可以创建否定先行断言模式的匹配,即某个字符串后面不包含另一个字符串的匹配模式。
否定先行断言模式通过 (?!pattern) 定义。比如,我们匹配后面不是跟着 "b" 的 "a":
a(?!b)
指定正则表达式的模式
可以在正则的开头指定模式修饰符。
- (?i)使正则忽略大小写。
- (?s)表示单行模式("single line mode")使正则的- .匹配所有字符,包括换行符。
- (?m)表示多行模式("multi-line mode"),使正则的- ^和- $匹配字符串中每行的开始和结束。
Java 中的反斜杠
反斜杠 \ 在 Java 中表示转义字符,这意味着 \ 在 Java 拥有预定义的含义。
这里例举两个特别重要的用法:
- 在匹配 .或{或[或(或?或$或^或*这些特殊字符时,需要在前面加上\\,比如匹配.时,Java 中要写为\\.,但对于正则表达式来说就是\.。
- 在匹配 \时,Java 中要写为\\\\,但对于正则表达式来说就是\\。
注意:Java 中的正则表达式字符串有两层含义,首先 Java 字符串转义出符合正则表达式语法的字符串,然后再由转义后的正则表达式进行模式匹配。
正则表达式常见应用示例
中文的匹配
[\u4e00-\u9fa5]+ 代表匹配中文字。
public static void test3(){
		String str = "这里有个新手易范的错误,就是正angongsi";
        Pattern pattern = Pattern.compile("[\\u4e00-\\u9fa5]+");
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
	}
数字范围的匹配
比如,匹配 1990 到 2017。
注意:这里有个新手易范的错误,就是正则 [1990-2017],实际这个正则只匹配 0 或 1 或 2 或 7 或 9 中的任一个字符。
正则表达式匹配数字范围时,首先要确定最大值与最小值,最后写中间值。
正确的匹配方式:
public static void test4(){
		String str = "1990\n2010\n2017\nsdfgadfggadfgdfgdfgafdgasfdga\n1998";
        // 这里应用了 (?m) 的多行匹配模式,只为方便我们测试输出
        // "^1990$|^199[1-9]$|^20[0-1][0-6]$|^2017$" 为判断 1990-2017 正确的正则表达式
        Pattern pattern = Pattern.compile("(?m)^1990$|^199[1-9]$|^20[0-1][0-6]$|^2017$");
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
	}
img 标签的匹配
比如,获取图片文件内容,这里我们考虑了一些不规范的 img 标签写法:
public static void test5(){
		 String str = "<img  src='aaa.jpg' /><img src=bbb.png/><img src=\"ccc.png\"/>" +
	                "<img src='ddd.exe'/><img src='eee.jpn'/>";
	        // 这里我们考虑了一些不规范的 img 标签写法,比如:空格、引号
	        Pattern pattern = Pattern.compile("<img\\s+src=(?:['\"])?(?<src>\\w+.(jpg|png))(?:['\"])?\\s*/>");
	        Matcher matcher = pattern.matcher(str);
	        while (matcher.find()) {
	            System.out.println(matcher.group("src"));
	        }
	}
邮箱匹配
邮箱匹配的正则的写法有很多,这里给出一种参考的写法。
合法E-mail地址:
- 必须包含一个并且只有一个符号“@”
- 第一个字符不得是“@”或者“.”
- 不允许出现“@.”或者.@
- 结尾不得是字符“@”或者“.”
- 允许“@”前的字符中出现“+”
- 不允许“+”在最前面,或者“+@”
等等
示例代码
public static void test6(){
		 String check = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
	     Pattern regex = Pattern.compile(check);
	     Matcher matcher = regex.matcher("dffdfdf@qq.com");
	     boolean isMatched = matcher.matches();
	     System.out.println(isMatched);
	}
手机号匹配
	public static void test7(){
		String check = "^((13[0-9])|(15[^4])|(18[0-9])|(17[0-9])|(147))\\d{8}$";
	     Pattern regex = Pattern.compile(check);
	     Matcher matcher = regex.matcher("18638693953");
	     boolean isMatched = matcher.matches();
	     System.out.println(isMatched);
	}
url匹配
public static void test8(){
		String url = "http://www.lubingyang.com/";
		String regex = "(https?://(w{3}\\.)?)?\\w+\\.\\w+(\\.[a-zA-Z]+)*(:\\d{1,5})?(/\\w*)*(\\??(.+=.*)?(&.+=.*)?)?";
		boolean isMatched = Pattern.matches(regex, url);
		System.out.println(isMatched);
	}
求点赞,求关注,求转发
欢迎关注本人公众号:鹿老师的Java笔记,将在长期更新Java技术图文教程和视频教程,Java学习经验,Java面试经验以及Java实战开发经验。
恭喜你,Get到一份 正则表达式 食用指南的更多相关文章
- 本人为项目组制定的一份页面优化指南(easyui页面优化方案)
		#本人为项目组制定的一份页面优化指南(easyui页面优化方案) ##背景 这是一篇我之前为项目组制定的页面优化指南,主要是面向表单页面,典型的像[注册用户](https://passport.cnb ... 
- 转:C++ Boost/tr1 Regex(正则表达式)快速指南
		C++ Boost/tr1 Regex(正则表达式)快速指南 正则表达式自Boost 1.18推出,目前已经成为C++11(tr1)的标准部分. 本文以Boost 1.39正则表达式为基础,应该广泛适 ... 
- 推荐一份 Google 面试指南
		经常有不少读者在我公众号后台留言,说自己还是应届毕业生,缺乏工作经验与项目经验,不知道如何才能通过面试? 其实,项目经验固然重要,但是企业也知道,对于应届毕业生,是很难有拿得出手的项目经验出来的,毕竟 ... 
- Angular 从入坑到挖坑 - 组件食用指南
		一.Overview angular 入坑记录的笔记第二篇,介绍组件中的相关概念,以及如何在 angular 中通过使用组件来完成系统功能的实现 对应官方文档地址: 显示数据 模板语法 用户输入 组件 ... 
- ffuf 基础食用指南
		PS: 1. 下文出现的某些字典 有可能是因为摆出效果 我自己瞎搞得字典 2. 分享一些好的工具 3. 其实Wfuzz也很好用的 4. 很早之前就在语雀写过Wfuzz和ffuf的笔记 但是一直没有公开 ... 
- Python正则表达式基础指南
		1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ... 
- [转] 整理了一份React-Native学习指南
		自己在学习React-Native过程中整理的一份学习指南,包含 教程.开源app和资源网站等,还在不断更新中.欢迎pull requests! React-Native学习指南 本指南汇集React ... 
- 一份React-Native学习指南-感谢分享
		自己在学习React-Native过程中整理的一份学习指南,包含 教程.开源app和资源网站等,还在不断更新中.欢迎pull requests! React-Native学习指南 本指南汇集React ... 
- 整理了一份React-Native学习指南
		原文: http://www.w3ctech.com/topic/909 自己在学习React-Native过程中整理的一份学习指南,包含 教程.开源app和资源网站等,还在不断更新中.欢迎pull ... 
随机推荐
- 18)C++对C的增强
			在C++中所有的变量都必须有类型,但是在C语言中没有这个要求,C语言中的默认类型在C++中不合法, #include<stdio.h> f() { ; } int main() { int ... 
- Python - 文件和目录
			# -*- coding: utf-8 -*- import os print(os.name) # 获取操作系统类型 # print(os.uname()) # 获取操作系统的详细信息,Win不支持 ... 
- K	破忒头的匿名信(ac自动机+小dp)
			题:https://ac.nowcoder.com/acm/contest/4010/K 题意:用一些模式串凑成一个目标串,每个模式串有消耗,问组合的最小消耗,或不能组成输出-1: 分析:典型的AC自 ... 
- NOIP2013D1T3货车运输 (生成树+树链剖分)
			给出一个图,询问图上两点间路径上最小边权的最大值. 先跑一次最大生成树. 树剖维护路径最小边权. 树剖又双叒叕写挂了. #include<cstring> #include<cstd ... 
- 项目课  day01
			## 电商 ### 定义 指在互联网(Internet).内部网(Intranet)和增值网(VAN,Value Added Network)上以电子交易方式进行交易活动和相关服务活动 ### 电商的 ... 
- QLIKVIEW-日期格式,数字格式写法
			LOAD T_SAL_ORDER.LE_ID, [T_SAL_ORDER.LCY CODE], T_SAL_ORDER.SYSTEM, T_SAL_ORDER.#DataDateTime, T_SAL ... 
- 51)PHP,一个数据库操作类的代码
			<?php //类名,也习惯上(推荐)使用跟文件名相似的名字 //定义一个mysql连接类,该类可以连接mysql数据库 //并实现其单例模式 //该类的功能还能够完成如下基本mysql操作: ... 
- 006.前端开发知识,前端基础CSS(2020-01-21)
			来源:第五天 01盒子水平居中 一.盒子中文字控制: 1.text-align: center; /*可以让盒子内容(文字 行内元素 行内块元素)居中对齐*/ 二.让盒子水平居中对齐: 方法1.ma ... 
- samtools faidx
			$ samtools faidx t1.fa && echo "faidx built" $ cat t1.fa.fai scaffold332 scaffold3 ... 
- maven中指定build一个project中几个特定的子modules
			问题由来: 一个项目可能会有多个子module,在特定情况下可能只需要build其中几个module. 例如我的项目的目录结构如下 myproject |------------module_one ... 
