🙋♂️ 作者:@whisperrr.🙋♂️
🎉 其他专栏:零基础学Mysql 🎉
💥 标题:掌握正则表达式:从入门到精通的实战指南💥
❣️ 寄语:比较是偷走幸福的小偷❣️
🌍一.正则表达式
❄️1.为什么学习正则表达式
我们先来看几个问题。
- 给你一个字符串(或文章),请你找出所有四个数字连在一起的子串?
- 给你一个字符串(或文章),请你找出所有四个数字连在一起的子串,并且这四个数字要满足:第一位与第四位相同,第二位与第三位相同,比如1221,5775
- 请验证输入的邮件,是否符合电子邮件格式.
- 请验证输入的手机号,是否符合手机号格式
解决之道,就在其中-----正则表达式。
❄️ 2.基本介绍
正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。正则表达式用于执行字符串的搜索和/或替换操作,常用于数据验证、数据抓取、数据整理等场景。
简单的说:正则表达式是对字符串执行模式匹配的技术。
❄️3.分析底层实现
- matcher.find()
matcher.find()完成的任务
- 根据指定的规则,定位满足规则的子字符串(比如1234)
- 找到后,将 子字符串的索引位置记录到matcher对象的属性int [] groups;
- groups[0] = 0, 把该 子字符串的结束索引 + 1 记录到groups[1] = 4;
- 同时记录oldlast 的值为 子字符串的结束索引 + 1即为4;
- matcher.group(0)
public String group(int group) {
if (first < 0)
throw new IllegalStateException("No match found");
if (group < 0 || group > groupCount())
throw new IndexOutOfBoundsException("No group " + group);
if ((groups[group*2] == -1) || (groups[group*2+1] == -1))
return null;
return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();
}
小结
1.如果正则表达式有()分组
2.group(0)代表匹配的子字符串
2.group(1)代表匹配的子字符串的第一组
2.group(2)代表匹配的子字符串的第二组
🌍二.正则表达式的语法
正则表达式(Regular Expression)是一种强大的文本处理工具,它通过定义一种规则来对字符串进行模式匹配、搜索和替换。下面我会详细讲解正则表达式的各个方面。
❄️1.字符匹配
-
.:匹配除换行符之外的任意单个字符。 -
[abc]:匹配方括号内的任意一个字符(a、b 或 c)。 -
[^abc]:匹配不在方括号内的任意一个字符。 -
[a-z]:匹配从 a 到 z 的任意一个小写字母。 -
[A-Z]:匹配从 A 到 Z 的任意一个大写字母。 -
[0-9]:匹配从 0 到 9 的任意一个数字。 -
\d:匹配一个数字字符。等价于[0-9]。 -
\D:匹配一个非数字字符。等价于[^0-9]。 -
\w:匹配包括下划线的任何单词字符。等价于[A-Za-z0-9_]。 -
\W:匹配任何非单词字符。等价于[^A-Za-z0-9_]。 -
\s:匹配任何空白字符,包括空格、制表符、换行符等等。 -
\S:匹配任何非空白字符。
❄️2.量词
-
*:匹配前面的子表达式零次或多次。 -
+:匹配前面的子表达式一次或多次。 -
?:匹配前面的子表达式零次或一次。 -
{n}:n 是一个非负整数,匹配确定的 n 次。 -
{n,}:至少匹配 n 次。 -
{n,m}:至少匹配 n 次且最多匹配 m 次。
❄️3.定位符
-
^:匹配输入字符串的开始位置。 -
$:匹配输入字符串的结束位置。 -
\b:匹配一个单词边界,即字与空格间的位置。 -
\B:匹配非单词边界。
4.分组和引用
-
(exp):匹配 exp 并捕获文本到自动命名的组里。 -
(?:exp):匹配 exp 但不捕获匹配的文本。 -
\n:引用编号为 n 的捕获组匹配的文本。
❄️6.非贪婪匹配
默认情况下,量词都是贪婪的,会尽可能多地匹配字符。在量词后面加上 ? 可以使其变为非贪婪的,即尽可能少地匹配字符。
-
*?:非贪婪地匹配任意次。 -
+?:非贪婪地匹配一次或多次。 -
??:非贪婪地匹配零次或一次。 -
{n,m}?:非贪婪地至少匹配 n 次且最多匹配 m 次。
❄️7.分支结构
可以使用 | 来表示分支结构,匹配符号左边的子表达式或右边的子表达式。
-
foo|bar:匹配 “foo” 或 “bar”。
❄️实际应用
在不同的编程语言中,正则表达式的语法和功能可能会有所不同,但基本概念是通用的。以下是一些使用正则表达式的例子:
package ***.lrx.regexp;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author 刘
* @version 1.0
*/
public class RegExp08 {
public static void main(String[] args) {
String content = "https://www.bilibili.***/video/BV1oDU4YYEgT/?spm_id_from=333.1007.tianma.4-4-14.click";
String regStr = "^((http|https)://)?([\\w-]+\\.)+[\\w-]+([\\w-#%&?.=/]*)?$";
Pattern pattern = Pattern.***pile(regStr);
Matcher matcher = pattern.