作为程序员之正则表达式

正则表达式#

基础语法###

标准字符集合#

\D 和[^\d]意思一样,就是与 \d 相反

REG 意义
\ddigital 表示 0 到 9 之间任意的一个数字
\wworld 表示任意一个字母或数字或下划线,不包含¥$%等
\sspace 表示包括空格、制表符、换行符等空白字符中任意一个
. 可以匹配任意一个字符

自定义的字符集合####

REG 意义
[ad# ]方括号 表示匹配 a 或 d 或 # 或 空格
^[ad# ] 表示除方括号以外的字符
[a-g] 表示匹配 a 到 g 之间的字符,别和上面的混淆了
[^a-f,0-3] 匹配除了 a - f 和 0 到 3以外的字符

匹配次数#

REG 意义
(\d){10} 前面的规则重复匹配了10次
{n,m} 表示至少重复n次,最多重复m次
{n,} 至少n次
?
+
*

多行、单行模式#

  1. 忽略大小写:ignorecase
  2. 单行模式:single line 整个串作为一个模板串
  3. 多行模式:multi line 模板串分为多个行

字符边界/匹配位置###

| REG | 意义|
| :-------- | --------😐 :------: |
| ^ | 与字符串开始的地方匹配|
| $ | 与字符串结束的地方匹配|
| \b| 表示在边界处匹配字符,放在左右会不一样的结果|

高级语法###

选择符和分组####

|REG| 意思 |
| :-------- | --------😐 :------: |
| \| | 表示‘或’的意思,匹配左边或右边 |
|()| 对正则表达式分组,更好地组织匹配|
|(?:Expression)|不把()组中匹配到的字符不保存到group中|

反向引用####

\nnn反向引用|把捕获的字符分组编号,左括号为一个分组

预搜索/零宽断言####

也是匹配位置

很少用的

|REG | 意义 |
| :-------- | --------😐 :------: |
| (\w)(?=Expression) | 匹配以Expression匹配到的字符结尾的字符|
| (\w)(?!Expression) | 匹配不能以Expression匹配到的字符结尾的字符|
| (\w)(?<=Expression) | 位置前面可以匹配Expression|
| (\w)(?<!Expression) | 位置后面可以Expression|

表达式 方向 说明
|GEG|意义|
|:----|----😐----😐
|(?=xxx) |正向预搜索(向右) 正向预搜索,判断当前位置右侧是否能匹配指定表达式 |
|(?!xxx) | 正向预搜索(向右) 正向预搜索否定,判断当前位置右侧是否不能够匹配指定表达式 |
|(?<=xxx)| 反向预搜索,反向预搜索,判断当前位置左侧是否能够匹配指定表达式|

例子###

匹配邮箱####


要考虑的问题:

  1. 把@前面的给匹配了:(\w+)
  2. 匹配“.”:. (因为“.”表示任意字符,所以要转义一下才能匹配到“.”)
  3. 把@后面的域名给匹配了,要考虑多层域名的匹配
  4. 用户名和域名中的大小写
  5. 用户名中含有 “.”
  6. 并不允许用户名中出现”-“

第一版
没能匹配到用户名中有 ”.“的邮箱
(\w+)@(\w+)(\.[a-zA-Z]{2,5}){1,2}

2989389@qq.com
adfj32KddkfKJAD@163.com
ajdf23AKDJFO@yahoo.com.cn
akdjf239290@guet.org
KFADJSFOAJDSFOAEJ@GUET.EDU.CN

最终版
(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})


这个可以匹配用户名含有“.“的邮箱

Copy
package regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class MatchMail { public static void main(String[] args) { //正则表达式 Pattern p = Pattern.compile("(\\w)+(\\.\\w+)*@(\\w)+((\\.\\w{2,3}){1,3})"); //待匹配的字符串 String str = "2989389@qq.com" + "adfj32KddkfKJAD@163.com" + "ajdf23AKDJFO@yahoo.com.cn" + "akdjf239290@guet.org" + "KFADJSFOAJDSFOAEJ@GUET.EDU.CN" +"23jka32ir.323dfj@qq.com" +"23rfasdf.com.@163.qq.com" ; //用正则表达式去匹配字符串 Matcher m = p.matcher(str); int i = 0; //如果发现,m.find()则为true while(m.find()) { //每一组匹配到的字符都被放到了group里 System.out.println(m.group(0)); i++; } System.out.println(i); } }

中文字符####

[\u4e00-\u9fa5]


用正则表达式取出正则表达式中括号里的数据#

Copy
package atest; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Aa { public static void main(String args[]) throws Exception { // 用正则表达式把字符串中的浮点数提取出来 // "\\d*[.]\\d*" 不能处理 .t3 // “\\(.*?\\)” 也是可以的 Pattern p = Pattern.compile("[\\d]+\\.[\\d]+"); String u = "Mv(2.50),Tl(3.25),3.t3,3.,3..,Tr(3.26),Bk(2.16)"; Matcher m = p.matcher(u); // 统计有多少个浮点数 int i = 0; while (m.find()) { System.out.println(m.group()); i++; } System.out.println(i); } }

匹配IP地址####

  1. 匹配:三个字符一个点 三个字符一个点 三个字符一个点 三个字符
  2. IP地址<255
  3. IP地址的数字不能以0开始,如:012.
  • 第一版:
Copy
((\d{1,3})\.){3}\d{1,3}

把562.264.351也匹配了,没能确定IP地址<255

  • 第二版(最终版)
Copy
(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
Copy
/ ** * 最简洁的IP判断正则表达式 * 25[0-5] 250-255 * 2[0-4]\d 200-249 * [01]?\d\d? 000-199(0-9 \d)(10-99 \d\d)(100-99 1\d\d) * ($|(?!\.$)\.) 结束 或者 不以.结束的加上. * (?!^0{1,3}(\.0{1,3}){3}$) 排除 0.0.0.0 /^(?!^0{1,3}(\.0{1,3}){3}$)((25[0-5]|2[0-4]\d|[01]?\d\d?)($|(?!\.$)\.)){4}$/ * (?!^255(\.255){3}$) 排除 255.255.255.255 */

电话、手机号码###

固定电话7位数,包含0开头和”—”
移动电话11位数,以13或15开头

Copy
(0\d{2,3}-\d{7,9})|(1[35]\d{9})

Copy
package regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestCode { public static void main(String[] args) { Pattern p = Pattern.compile("(0\\d{2,3}-\\d{7,9})|(1[35]\\d{9})"); String str = "15907877344" + "0774-1593849" + "13877477862" + "1555615951" + "6651651565151" + "13515a1dfa91w13" + "434$tfsf51asf51" + "8E94 WE8"; Matcher m = p.matcher(str); while(m.find()) { System.out.println(m.group(0)); } } }

所用到的工具是RegexBuddy

posted @   M_Kepler  阅读(1481)  评论(4编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示
CONTENTS