【正则表达式】粗浅学习

文章目录

  • [1 背景介绍](#1 背景介绍)
    • [1.1 为什么要学习正则表达式?](#1.1 为什么要学习正则表达式?)
    • [1.2 什么是正则表达式?](#1.2 什么是正则表达式?)
    • [1.3 正则表达式可以做什么?](#1.3 正则表达式可以做什么?)
  • [2 基本语法](#2 基本语法)
  • [3 典型案例](#3 典型案例)
    • [3.1 正整数](#3.1 正整数)
    • [3.2 IPv4类型的IP地址](#3.2 IPv4类型的IP地址)
      • [3.2.1 点分10进制表示格式](#3.2.1 点分10进制表示格式)

1 背景介绍

1.1 为什么要学习正则表达式?

日常学习或者其他场景中,经常会遇到针对文本文件中的内容进行查找、日志分析等,对正则表达式不了解或者不清楚,搞的比较难做。

1.2 什么是正则表达式?

正则表达式,Regular Expression,简称RE。

它表达的是一种文本模式。

它自己是一个字符串。

它是一些字符和特殊字符组成的。

1.3 正则表达式可以做什么?

反正挺有用的,知道的人都知道。几个常用的地方:

1、单个文件内查找指定模式的字符串

2、磁盘上查找文件名称匹配某个模式的文件,列出来匹配了规则的文件路径

3、和linux命令grep、sed、awk等结合使用,做到删除、替换、查找文本等常规操作。

4、和java或者shell编程实现文本的高级处理

5、其他字符串处理的场景。

总之,正则表达式的使用场景在字符串领域是应用广泛的,值得稍微花点时间学习一下。

2 基本语法

序号 字符分类 字符 简要说明 使用介绍
1 普通字符 [A-Z] 从字符串中匹配大字母字符 --
2 普通字符 [a-z] 从字符串中匹配小写字母字符 --
3 普通字符 [0-9] 从字符串中匹配数字 相当于\d
4 普通字符 [A-Za-z] 从字符串中匹配所有字母字符 --
5 普通字符 [A-Za-z0-9] 从字符串中匹配字母和数字 --
6 普通字符 [具体的字符集合] 从字符串中匹配指定的字符集合中的字符 例如:[abc123] 就是从字符串中匹配a、b、c、1、2、3的字符,但凡字符串中出现这6个字符,都判定为命中状态。
7 普通字符 [^具体的字符集合] 非的逻辑,匹配字符串中不在指定范围内字符 例如:[^A-Z]表示匹配字符串中不是大写字母的字符。
8 普通字符 .字符点(我很小看不清) 匹配1个字符,这个字符是任意字符,但是不包括换行符(\n和\r) 等效于[^\n\r]
9 普通字符 \d 匹配数字 等效于[0-9]
10 普通字符 \w 匹配字母、数字、下划线 等效于[A-Za-z0-9_]
1 定位字符 ^正则模式字符串 匹配输入字符串的开始位置,相当于是限定在开头要匹配命中。 例如:^[#*],匹配开头是#或者*的字符串。
2 定位字符 正则模式字符串$ 匹配输入字符串结尾位置,相当于限定要从结尾开始匹配 例如:[#*]$,匹配结尾是#或者*的字符串。
1 转义字符 \ 反斜杠字符,转义字符,把特殊意义的符号的特殊意义去除 例如:\.\ 表示的是匹配包括.字符的字符串,而不是表示作为字符串结尾包括.的字符串。如果要匹配的是以圆点.结尾的字符串,那么正则是这样的:\.$
1 元字符 * 该字符跟在其他字符后面的位置,表示的是匹配前面的子表达式0次或者多次,注意包括0次。 也就是大于或等于0次,相当于{0,},举例:zo*,意思是匹配z字母后面跟大于等于0个o字母,包括z,zo,zoo等等。
2 元字符 + 匹配前面子表达式大于等于1次 相当于{1,}
3 元字符 ? 匹配前面子表达式0或1次 相当于{0,1}
3 元字符 ? 如果?前面一些特殊字符(*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的 例如:如果字符串是123456,正则表达式是\d+ ,默认是贪婪的,那么结果匹配得到123456,如果正则表达式是\d+?,此时转换为非贪婪方式的,那么结果是1、2、 3、 4、 5、 6。
4 元字符 {n} 匹配前面子表达式n次
5 元字符 {n,} 匹配前面子表达式>=n次
6 元字符 {n,m} 匹配前面子表达式n~m次,包括n和m,m>=n 例如:abc{1,3} 意思是匹配abc,abcabc,abcabcabc三种情况
7 元字符 子表达式1|子表达式2 匹配子表达式1和子表达式2, 例如:abc|123,表示匹配abc或者123两种情况

3 典型案例

正则表达的编写有3点需要重点注意:
第一 ,先确定要目标的完整定义,并针对正则表达式需要设计全量的测试用例场景;
第二 ,特殊字符可能会应用到普通字符场景,一定要进行转移;
第三,重新审视写完的正则表达式,进行精简。

3.1 正整数

正则表达式要达成的目标定义:

和整数一样,正整数也是一个可数的无限集合。在数论中,正整数,即1、2、3......;但在集合论和计算机科学中,自然数则通常是指非负整数,即正整数与0的集合,也可以说成是除了0以外的自然数就是正整数。正整数又可分为质数,1和合数。正整数可带正号(+),也可以不带。
具体写法:

bash 复制代码
写法1:
\+{0,1}[1-9][0-9]{1,}|\+{0,1}[1-9]
写法2:
\+?[1-9][0-9]+|\+?[1-9]
写法3:
\+?[1-9]\d+|\+?[1-9]
写法4:
\+{0,1}[1-9][0-9]{0,}
写法5:
\+?[1-9]\d*

其中涉及到转义字符、元字符? * {} 等的使用,需要特别小心。

3.2 IPv4类型的IP地址

3.2.1 点分10进制表示格式

正则表达式要达成的目标定义:

点分10进制表示格式是IP地址的标准表示方法。在这种格式中,IP地址由四个部分组成,每个部分是一个0到255之间的整数,各部分之间用点(.)分隔。例如,一个有效的IP地址可能是192.168.1.1。这种格式的优点是易于阅读和排序,同时也方便进行数学计算。每个部分代表一个8位的二进制数,因此整个IP地址可以表示一个32位的二进制数。这种格式也方便网络设备和软件进行解析和处理。
具体写法:

下面的写法是针对给定一个字符串来准确判断是否为有效IPv4地址的正则表达式:

bash 复制代码
^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$

如果只是想要简单的从日志等文本文件中抓出类似IPv4地址格式的内容,可以使用下面的正则表达式:

bash 复制代码
(\d+\.){3}(\d+)

通过这种方式可以抓全相关的类似IPv4点分格式的文本,如果用上面去掉开头^和结尾$,有的时候匹配的情况的结果可能会存在截断的效果,从日志分析上看,还不如下面这个短的方式来的方便。
但是,
要注意,不是所有的地方都会支持各种特殊简写的方式,比如:
简单的[0-9] 不是所有地方都支持\d的简写方式,实际应用的时候要注意识别,避免出错。

相关推荐
壹号用户2 天前
python学习之正则表达式
python·学习·正则表达式
xiaozaq2 天前
java 正则表达式 所有的优先级
java·开发语言·正则表达式
ColderYY2 天前
Python中的正则表达式
开发语言·python·正则表达式
李宥小哥2 天前
正则表达式详解
正则表达式
珊瑚礁的猪猪侠5 天前
正则表达式入门到精通教程(Linux实操版)
linux·人工智能·正则表达式
!win !6 天前
分享二个实用正则
javascript·正则表达式
xw56 天前
分享二个实用正则
javascript·正则表达式
刺客-Andy7 天前
Python 第二十节 正则表达式使用详解及注意事项
python·mysql·正则表达式
好好好起个名真难7 天前
正则表达式
正则表达式
坚持就完事了8 天前
正则表达式与Python的re模块
python·正则表达式