⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/yuyinghe0612/article/details/80559979 「yuyinghe0612」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

一 正则表达式 (regular Expression) 简介

1.为什么需要正则表达式?

  • 文本的复杂处理

2.正则表达式的优势和用途?

  • 一种强大而灵活的文本处理工具;
  • 大部分编程语言,数据库,文本编辑器,开发环境都支持正则表达式

3.正则表达式定义:

  • 正如它的名字一样是描述一个规则,通过这个规则可以匹配一类字符串
  • 学习正则表达式很大程度上就是学习正则表达式的语法规则

二 开发中如何使用?

开发中使用正则表达式的流程:

  • 分析所要匹配的数据,写出测试用的典型数据
  • 在工具软件中进行匹配测试
  • 在程序中调用通过测试的正则表达式

三 正则表达式语法

  • 普通语法

字母,数字,汉字,下划线,以及没有特殊定义的标点符号,都是普通字符.

表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符

  • 简单的转义字符

  • 标准字符集合

能够与'多种字符'匹配的表达式

注意区分大小写,大写是相反的意思

  • 自定义字符集合

[ ] 方括号匹配方式,能够匹配方括号中的任意一个字符

正则表达式的特殊符号,被包含到中括号中,则失去特殊意义,除了^和-之外

标准字符集合, 除了小数点外,如果被包含于中括号,自定义字符集合将包含该集合

比如: [\d.\- +]将匹配 数字,小数点,+ ,-

  • 量词(Quantifier)

修饰匹配次数的特殊符号

\d{6} 重复6次 \d\d{6}重复7次 (\d\d){6}重复12次

\d{1,6} 匹配连续1~6次数字 ,从6开始匹配,贪婪模式

\d{1,6}? 匹配连续1~6次数字 ,从1开始匹配,非贪婪模式

\d{4,} 匹配连续 4个数字以上

匹配次数中的贪婪模式(匹配字符越多越好,默认)

匹配次数中的非贪婪模式(匹配字符越少越好,修饰匹配次数的特殊符号后加上一个"?"号)

  • 字符边界

本组标记匹配的不是字符而是位置,符号某种条件的位置-----------零宽

\b匹配这样一个位置: 前面的字符和后面的字符不全是\w

  • 正则表达式的匹配模式

IGNORECASE 忽略大小写模式

匹配时忽略大小写

默认情况下,正则表达式是要区分大小写的

SINGLELINE 单行模式

整个文本看作一个字符串,只有一个开头,一个结尾

使小数点"."可以匹配包含换行符(\n)在内的任意字符

MULTILINE 多行模式

每行都是一个字符串,都有开头和结尾

在指定了MULTILINE之后,如果需要仅匹配字符串开始和结束位置,可以使用\A和\Z

  • 选择符和分组

  • 反向引用(\nnn)

每一对()会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号

通过反向引用,可以对分组已捕获的字符串进行引用

  • 预搜索(零宽断言)

只进行子表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度

这个位置应该符合某个条件.判断当前位置的前后字符,是否符合指定的条件,但不匹配前后的字符.是对位置的匹配

正则表达式匹配过程中,如果子表达式匹配到的是字符内容,而非位置,并被保存到最终的匹配结果中,那么就认为这个子表达式是占有字符的;如果子表达式匹配的仅仅是位置,或者匹配的内容并不保存到最终的匹配结果中,那么就认为这个子表达式是零宽的.占有字符还是零宽度,是针对匹配的内容是否保存到最终的匹配结果中而言的

四 电话号码验证

五 电子邮件地址验证

常用正则表达式列表

六 JAVA程序中使用正则表达式

  • 相关类位于: java.util.regex包下
  • 类Pattern:

正则表达式的编译表达形式

Pattern p = Patttern.compile\(r,int\); //建立正则表达式,并启动相应模式

  • 类Matcher:

通过解释Pattern对character sequence 执行匹配操作的引擎

Matcher m = p.matcher(str);  //匹配str字符串

/*
* 测试正则表达式的基本用法
* */
public class Demo01 {

public static void main(String[] args) {

//在这个字符串:asfsd23323,是否符合指定的正则表达式:\w+
//表达式对象
Pattern p = Pattern.compile("\\w+");
//创建Matcher对象
Matcher m = p.matcher("asfsd&&23323");
boolean result = m.matches(); //尝试将整个字符序列与该模式匹配
System.out.println(result);

//该方法扫描输入的序列,查找与该模式匹配的下一个子序列
boolean result2 = m.find();
System.out.println(result2);
System.out.println(m.group());

while (m.find()) {
System.out.println(m.group()); //group(),group(0)匹配整个表达式的子字符串
System.out.println(m.group(0));
}
}
}

/*
* 测试正则表达式对象中分组的处理
* */
public class Demo02 {

public static void main(String[] args) {
//在这个字符串:asfsd23323,是否符合指定的正则表达式:\w+
//表达式对象
Pattern p = Pattern.compile("([a-z]+)([0-9]+)");
//创建Matcher对象
Matcher m = p.matcher("aa232*ssd445*sds223");

while (m.find()) {
System.out.println(m.group(0));//匹配到整个表达式的子字符串内容
System.out.println(m.group(1));//匹配到第一个表达式的内容
System.out.println(m.group(2));//匹配到第二个表达式的内容
}
}
}

/*
* 测试正则表达式对象的替换操作
* */
public class Demo03 {
public static void main(String[] args) {
//在这个字符串:asfsd23323,是否符合指定的正则表达式:\w+
//表达式对象
Pattern p = Pattern.compile("[0-9]");
//创建Matcher对象
Matcher m = p.matcher("aa232*ssd445*sds223");

//替换
String newStr =m.replaceAll("#");
System.out.println(newStr);
}
}

/*
* 测试正则表达式对象的分割字符串操作
* */
public class Demo04 {
public static void main(String[] args) {
String str = "a,b,c";
String[] arrs = str.split(",");
System.out.println(Arrays.toString(arrs));

String str2 = "a232b4334c3434";
String[] arrs2 = str2.split("\\d+");
System.out.println(Arrays.toString(arrs2));
}
}

/*
* 网络爬虫取链接
* */
public class WebSpiderTest {

/*
* 获得urlStr对应的网页的源码
* */
public static String getURLContent(String urlStr,String charset) {
StringBuilder sb = new StringBuilder();
try {
URL url = new URL(urlStr);
BufferedReader reader = new BufferedReader(
new InputStreamReader(
url.openStream(),Charset.forName(charset)
)
);
String temp = "";
while ((temp = reader.readLine()) != null) {
sb.append(temp);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}

public static List<String> getMatherSubstrs(String destStr, String regexStr) {

Pattern p = Pattern.compile(regexStr);
Matcher m = p.matcher(destStr);
List<String> list = new ArrayList<>();
while (m.find()) {
list.add(m.group(1));
}
return list;

}

public static void main(String[] args) {
String destStr = getURLContent("http://www.163.com/","gbk");

//Pattern p = Pattern.compile("<a[\\s\\S]+?</a>"); //取到的超链接的整个内容
//Pattern p = Pattern.compile("href=\"(.+?)\""); //取到的超链接的地址

List<String> result = getMatherSubstrs(destStr, "href=\"([\\w\\s./:]+?)\"");
for (String str:result) {
System.out.println(str);
}
}
}

文章目录
  1. 1. 一 正则表达式 (regular Expression) 简介
  2. 2. 二 开发中如何使用?
  3. 3. 三 正则表达式语法
  4. 4. 四 电话号码验证
  5. 5. 五 电子邮件地址验证
  6. 6. 六 JAVA程序中使用正则表达式