Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >简单粗暴的正则表达式笔记

简单粗暴的正则表达式笔记

原创
作者头像
刘大猫
发布于 2024-12-03 13:21:53
发布于 2024-12-03 13:21:53
1390
举报
文章被收录于专栏:JAVA相关JAVA相关

@TOC

一、正则

正则表达式是用来描述具有一定特征的字符串的特殊字符串。 Regular Expression。

正则表达式本身也是一个字符串,类似于“元数据”的概念,相当于查找结构信息。 正则表达式,又称规则表达式。

符号

描述

.

匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \.

*

匹配前面的子表达式零次或多次。要匹配 字符,请使用 \

至少一个

\d

表示数字0-9

\D

匹配一个非数字字符。等价于 ^0-9

\w

表示任意字母、数字、_

\W

^\w,表示非字母、数字、_

()

标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)

\s

表示任意空白(空格、空、tab、换行符...)

\S

^\s,表示非空白(空格、空、tab、换行符...)

^

匹配输入字符串的开始位置,除非在方括号[]表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 \^

$

匹配输入字符串的结尾位置

?

匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?

\

将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("

|

指明两项之间的一个选择。要匹配 |,请使用 \|

{n}

n 是一个非负整数。匹配确定的 n 次

{n,}

n是一个非负整数。至少匹配n 次

{n,m}

m 和 n 均为非负整数,其中 n <= m。最少匹配 n 次且最多匹配 m 次

[]

匹配中括号集合中的任意一个字符

\b

匹配一个单词边界。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。

\B

匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

(?=pattern)

先行断言,断言自身出现的位置的后面能匹配表达式exp。例如:如果我们想要匹配一个单词,这个单词中有一个字母a,a后面不是字母b,就像apple,hallo,但不能是absolute,那么写法为:\ba-z*a(?!b)a-z*\b

(?!pattern)

先行断言,断言自身出现的位置的后面不能匹配表达式exp。

(?<=pattern)

后行断言,断言自身出现的位置的前面能匹配表达式exp。

(?<!pattern)

后行断言,断言自身出现的位置的前面不能匹配表达式exp。

1.入门

1)、 匹配 match

==所谓的匹配,匹配子串即可。==

2)、作用

==验证、查找、替换、分割==

2、字符集

默认情况下区分大小写。

1)、 普通字符

非特殊含义以外的字符,如 a b 中国 尚学堂

2)、 元字符与转义

==14 个元字符: { } \ ^ $ . * + ? |→ 特殊含义==

转义字符: +字母 \d 0-9 \ \ \s空白符 \w –>字母数字_ (没有中文)

3)、 字符类

a)、自定义

由[]组,只匹配一个, 需要注意以下四个:

^: 如果在第一个位置,表示取反的含义。

-表示一个区间即范围

] 最后一个位置为:结束

\ 转义

.==在字符类中 不是代表任意的字符,代码 自身 .的含义。

如果需要表示原有的含义,挪到位置 或者\ 。==

b)、默认|标准字符类

3. 量词

匹配的过程中,需要指定次数。

  • 0 个及以上
  • 1 个及以上 ? –>0 或 1 个 {n}n 次 ,非负数 {n,}大于等于 n 次 {n,m} –>大于等于 n 小于等于 m 次4. 贪婪模式在匹配次数不定时如* {n,} +,匹配字符越多越好,默认模式即”贪婪模 贪婪模式 greedy(匹配字符越多越好,可回溯) “回溯”指,可以从最后往前面找 ?懒惰模式 lazy reluctant (匹配字符越少越好,可回溯) +独占模式 possessive(匹配字符越多越好,不可回溯) 用的较少
代码语言:java
AI代码解释
复制
.*o –>贪婪模式
.{2,}o–>贪婪模式
.{2,}?o –>懒惰模式
.{2,}+o –>独占模式,不可回溯 没有匹配到内容。

5.边界

1)、 边界不占用宽度,只是一个界限。

2)、 ^ :开始 \b:单词边界 \B:非单词边界 $:结束

^:多行代表每行头 单行代表整个字符串的开始

$: 多行代表每行尾 单行代表字符串的结尾

\b 匹配前面或后面的不是\w

\B 匹配前面或后面的是\w

6. 选择符与分组

1)、选择符

| → 优先级低 ,满足匹配则停止,不会查找更优的方案

hellohe

he|hello –>只匹配 he,不匹配 hello

hello|ehe 匹配 he 与 hello

2)、分组

() 组,提高优先级,内部存在缓存,==可以使用缓存即反向引用。==

必须认识组编号,为( 的位置

(")test\1 –> “第 1 个左括号中

((")test)\2 –> “第 2 个左括号中

非捕获组:(?:xxx) : 不缓存组

3)、 模式修改符

==(?ism )*(?-ism)

i: insensitive 使正则表达式对大小写不敏感; (重点)==

s: singleline 开启“单行模式”,即点号“ .”匹配新行符;

m: multiline 开启“多行模式”,即“ ^”和“ $”匹配新行符的前面和后面的位置。

代码语言:java
AI代码解释
复制
Select
select
select
SELECT * from

(?i)select(?-i) 不区分大小写。

7. 零宽断言(难点)

前瞻( Lookahead) 后顾( Lookbehind)

问题:什么是断言?

答案:断言用于查找某些内容或内容所在的位置,该内容或内容所在位置应满足一定的条件。

二、简单正则案例练习

案例1:匹配11位手机号,要求:第一位数字为1,第二位数字是34578中的一个,接下来后9位都是0到9的数字

代码语言:java
AI代码解释
复制
@Test
public void regular3() {
    String regular = "^1[34578]\\d{9}$";
    String str1 = "15221621619";
    String str2 = "11221621619";
    System.out.println("手机号str1校验:" + Pattern.compile(regular).matcher(str1).find());  //手机号str1校验:true
    System.out.println("手机号str2校验:" + Pattern.compile(regular).matcher(str2).find());  //手机号str2校验:false
}

案例2:匹配QQ号,要求:第一个数不可能是0,目前qq最多是10位数字,最少5位

代码语言:java
AI代码解释
复制
@Test
public void regular4() {
    String regular = "^[1-9][0-9]{4,9}";
    String str3 = "924382";
    String str4 = "0101";
    System.out.println("QQ号str3校验:" + Pattern.compile(regular).matcher(str3).find());  //QQ号str3校验:true
    System.out.println("QQ号str4校验:" + Pattern.compile(regular).matcher(str4).find());  //QQ号str4校验:false
}

案例3:采用“零宽断言”需求:在字符串 ‘北京市(朝阳区)(西城区)(海淀区)’ 中,取出没有被()包裹的字符 北京市

需求:在字符串 ‘北京市(朝阳区)(西城区)(海淀区)’ 中,取出没有被()包裹的字符 北京市

你可能有疑问,如果我正则写成这个样子.*(?=(),为什么结果就不对?这个正则结果是:北京市(朝阳区)(西城区)

答案:

代表匹配除了换行和行结束符的任意字符

  • 代表匹配任意次数,保证我们得到的是北京市而不是市这个单字 ? 代表对多个连续的值,要么匹配0次,要么匹配1次,最多匹配一次

上面说了,?在这个表达式里,表示要么不匹配,要么最多匹配一次,这就是非贪婪模式

而不添加?,表达式以贪婪模式运行。什么是贪婪模式?就是尽可能多的去匹配,匹配到了还去匹配,贪得无厌,一直匹配到字符串的末尾

因为字符串中有三个(,贪婪模式下会一直匹配到字符串结尾,就会得到“北京市(朝阳区)(西城区)”这个结果。

代码语言:java
AI代码解释
复制
@Test
public void regular5() {
    String regular = ".*?(?=\\()";
    String str5 = "北京市(朝阳区)(西城区)(海淀区)";
    Matcher matcher = Pattern.compile(regular).matcher(str5);
    if (matcher.find()) System.out.println("采用‘零宽断言‘,对str5提取想要内容:" + matcher.group());  //采用‘零宽断言‘,对str5提取想要内容:北京市
    }

三.常用类

1.正则

java.util.regex Pattern Matcher String

查找、替换、分割、组的使用

1)、 Pattern

2)Matcher(匹配器)

3)、字符串与正则

三.附件

Eclipse和JS的2种使用正则方法:

代码语言:java
AI代码解释
复制
Eclipse使用正则:
//第一种使用方法matches(正则)    公式:str.matches(reg) 
		String reg="\\d";
		String str="lksdafks2dkjf2lkds4sjdflksd6lkdj";
		System.out.println(str.matches(reg));
		//replace 识别正则表达式的时候默认替换第一个满足正则的内容,如果想要替换多个,使用replaceAll
		System.out.println(str.replaceAll("\\d", "S")); 把所有数字替换成S
		//切割字符串
		System.out.println(Arrays.toString(str.split("\\d")));
		
//第二种使用方法Pattern 表示正则语法的类
		Pattern regex=Pattern.compile(reg);
		//获取匹配器对象  公式: regex.matcher(str)
		Matcher macher=regex.matcher(str);
		//查找是否有满足条件的内容,继续向下查找
		System.out.println(macher.find());
		System.out.println(macher.find());






js中使用正则:
<!--
        js中使用正则:
            match  匹配
                可以是第一个满足的内容--数组
                可以是所有满足的内容--数组  --g 代表全局变量
                如果没有满足条件的返回null
            test 判断是否满足 true,false
--> 

<script>
        var str="ab1cadac";
        var str2='A3441';
        //全局匹配,获取多个能满足正则语法的数组形式的内容

        //隐式定义正则形式  使用/xxxx/
        var reg1=/^[A-Z]\d{5}$/;
        //显示定义正则    使用new RegExp(‘’)
        var reg2=new RegExp('\\d');
        
        var arr=str2.match(reg1);//第一种方法使用match,  公式: str2.match(reg1)
        console.log(arr);

        console.log(reg1.test(str2)); //第二种方法使用test,  公式: reg1.test(str2)
    </script>

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java中是如何支持正则表达式操作的?
Java中的String类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()。此外,Java中可以用Pattern类表示正则表达式对象,它提供了丰富的API进行各种正则表达式操作,请参考下面面试题的代码。
唐怀瑟
2018/08/30
6560
正则表达式处理复杂文本,效率就是高!
\d{6} 重复6次 \d\d{6}重复7次 (\d\d){6}重复12次
公众号 IT老哥
2022/12/17
3850
正则表达式处理复杂文本,效率就是高!
Java中正则表达式
PS:更多其他符号,可参照 http://www.cnblogs.com/Mustr/p/6057159.html
会说话的丶猫
2021/03/09
3460
正则表达式基本使用
3、QQ号码,要求:1-9 开头的一个(5 位数-10位数) ,如: 1123762674
兮动人
2023/10/20
2590
正则表达式
一、定义 正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式中的元字符 eg:"\\dhello"中的\\d就是有特殊意义的元字符,代表0--9数字中的任意一个,而9hello,1hello都是和正则表达式\\dhello匹配的字符串  ------------------------------------------------------------------------------------------------------------------------------
听着music睡
2018/05/18
8250
Java正则表达式详解
本文主要介绍了Java技术体系中一些常见的基础概念和知识点,包括面向对象、集合、流程控制、异常处理、多线程、IO模型、网络编程、数据库、框架、设计模式等。通过掌握这些基础概念和知识点,可以更好地理解和掌握Java技术体系,为后续的学习和实践打下坚实的基础。
Java后端工程师
2017/12/18
2.6K0
正则表达式
//^ 匹配输入字符串开始的位置 //$ 匹配输入字符串结尾的位置 //* 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配z,zo,zoo等 Pattern p = Pattern.compile("^zo*$"); Matcher m = p.matcher("zooo"); System.out.println("*测试:" + m.matches()); //+ 一次或多次匹配前面的字符或子表达式。例如,“zo+”与“zo”和
提莫队长
2018/05/18
7000
编程笔记_JAVA_正则表达式工具
java.util.regex.Pattern; //模式类:字符串要被匹配的模式
陈黎栋
2020/02/17
9220
优秀攻城师必知的正则表达式语法
最近公司的一个项目,大量用到了正则来处理文本,以前对正则使用仅限于小打小闹,用的也是一知半解,经过本次的深入使用,发现正则表达式真的是每一位开发者都需要具备的一个基础技能,处理文本的功能异常强大。今天我们就来系统的学习一下它。
我是攻城师
2019/08/05
1.3K0
优秀攻城师必知的正则表达式语法
java正则表达式保姆级教程,从小白到高手
正则表达式看似简单,实则门路颇多,究其原因也就是其太灵活了。完全掌握还是需要耗费一些功夫的。
程序员田同学
2021/12/31
3650
java正则表达式保姆级教程,从小白到高手
正则表达式真的很骚,可惜你不会写!
正则表达式在几乎所有语言中都可以使用,无论是前端的JavaScript、还是后端的Java、c#。他们都提供相应的接口/函数支持正则表达式。
Java团长
2019/07/11
5300
正则表达式
引用会把匹配到的组按编号存入缓存,0编号表示整体,后面依次是匹配的内容,使用\n来访问分组:
晚上没宵夜
2022/05/09
4440
Java Review (二十二、正则表达式)
正则表达式是一个强大的字符串处理工具 ,可以对字符串进行查找、提取、分割、替换等操作 。 String类里也提供了如下几个特殊的方法 :
三分恶
2020/07/16
5550
前端进阶必须知道的正则表达式知识
正则表达式(Regular Expression) 是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑。
石燕平
2019/12/03
7920
Java中使用正则表达式
Java语言中的正则表达式匹配功能主要是通过java.util.regex.Matcher类和以下这些方法实现的。
码客说
2023/01/13
9440
Java中使用正则表达式
java正则表达式解析「建议收藏」
学习正则表达式,我觉得还是要循循渐进,由易到难,一点点深入……(本人也在学习中这里提供个人理解思路,以及一些大神们的独到讲解。。。。。。)
全栈程序员站长
2022/09/09
1.3K0
java正则表达式解析「建议收藏」
Java正则表达式
String[] split(CharSequence input) 根据此模式的正则表达式将输入的字符串拆分成String数组,默认的都是全部拆分开
爱撒谎的男孩
2019/12/31
1K0
简单的正则表达式入门
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
王图思睿
2021/06/16
1K0
22 Java 正则表达式
正则表达式(regular expression)用于指定字符串的模式,你可以在任何需要定位匹配某种特定模式的字符串的情况下使用正则表达式。 正则表达式语法 正则表达式语法(续) 表1-9 预定义的字符类名字 大部分字符都可以与它们自身匹配 .符号可以匹配任何字符(有可能不包括行终止符,这取决于标志的设置)。 使用 \ 作为转义字符,例如,\. 匹配句号而 \\ 匹配反斜线。 ^ 和 $ 分别匹配一行的开头和结尾。 如果 X 和 Y 是正则表达式,那么 XY 表示“任何 X 的匹配后面跟随
acc8226
2022/05/17
4540
22 Java 正则表达式
尚学堂-马士兵-专题-正则表达式
正则表达式是处理字符串的。 其实更确切的说,正则表达式是处理字符的。 就拿上面的例子来说, 每一个点代表一个字符。 那么abc是不是三个字符呀?是, 所以满足条件。
用户7798898
2020/09/27
1.2K0
尚学堂-马士兵-专题-正则表达式
相关推荐
Java中是如何支持正则表达式操作的?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档