【正则表达式】粗浅学习

文章目录

  • [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的简写方式,实际应用的时候要注意识别,避免出错。

相关推荐
SunnyRivers9 小时前
基础爬虫案例实战
正则表达式·爬虫实战·多进程·requests
西洼工作室1 天前
【java 正则表达式 笔记】
java·笔记·正则表达式
kiss strong2 天前
正则表达式
正则表达式
Linux运维技术栈2 天前
Python字符串及正则表达式(十一):正则表达式、使用re模块实现正则表达式操作
开发语言·python·正则表达式
jackiendsc2 天前
Java中正则表达式的介绍、使用场景及示例代码
java·开发语言·正则表达式
taller_20002 天前
VBA之正则表达式(48)-- 快速拆分中文语句
正则表达式·正则·拆分中文·中文拆分·中文标点
梧桐树04292 天前
python:正则表达式
数据库·python·正则表达式
葡萄架子2 天前
Python中的正则表达式
python·mysql·正则表达式
Oneforlove_twoforjob3 天前
【Java】正则表达式基础题+场景题练习
正则表达式
产幻少年3 天前
正则表达式
正则表达式