正则表达式篇

一、正则表达式概述

正则表达式是一种强大的文本处理工具,可以精确地描述要匹配的字符组合,使文本处理更加高效。它广泛应用于文本编辑、数据处理、网络编程等领域。

二、正则表达式基本命令字符

2.1 匹配与通配

  • / :用于定界正则表达式,表示匹配模式的开始和结束。

  • . :匹配除换行符以外的任意单个字符。

    • 示例:/a.t/ 可以匹配 "art"、"act" 等,其中 "a" 和 "t" 分别是固定的字符,中间的任意字符由 . 匹配。
  • [] :匹配括号内的任意一个字符。

    • 示例:/[abc]/ 可以匹配 "a"、"b" 或 "c"。

    • 示例:/[0-9]/ 可以匹配任意一个数字字符。

2.2 范围与排除

  • - :在方括号 [] 中表示范围。

    • 示例:/[a-z]/ 可以匹配任意一个小写字母。

    • 示例:/[0-9a-f]/ 可以匹配十六进制数字(0-9 和 a-f)。

  • ^ :在方括号 [] 中表示取反,匹配不在括号内的任意一个字符;在方括号外表示匹配每一行的开头。

    • 示例:/[^0-9]/ 匹配非数字字符。

    • 示例:/^Hello/ 匹配以 "Hello" 开头的行。

2.3 字符类

  • \d :匹配数字字符(等价于 [0-9])。

  • \D :匹配非数字字符(等价于 [^0-9])。

  • \w :匹配字母、下划线或数字字符(等价于 [a-zA-Z0-9_])。

  • \W :匹配非字母、下划线或数字字符(等价于 [^a-zA-Z0-9_])。

  • \s :匹配空白字符(包括空格、Tab 等)。

  • \S :匹配非空白字符。

  • \b :匹配单词边界。

    • 示例:/\bword\b/ 可以精确匹配整个单词 "word",而不会匹配到类似 "wording" 中的 "word"。
  • \B :匹配非单词边界。

  • \. :匹配点号,因为点号在正则中有特殊意义,需用转义字符 \ 表示其本身。

2.4 重复与数量词

  • + :表示前面的字符重复一次或多次。

    • 示例:/a+/ 可以匹配 "a"、"aa"、"aaa" 等。
  • * :表示前面的字符重复零次或多次。

    • 示例:/a*/ 可以匹配空字符串、"a"、"aa" 等。
  • ? :表示前面的字符重复零次或一次。

    • 示例:/a?/ 可以匹配空字符串或 "a"。
  • {n} :表示匹配恰好 n 次重复。

    • 示例:/a{3}/ 匹配 "aaa"。
  • {m,n} :表示匹配至少 m 次但不超过 n 次重复。

    • 示例:/a{2,4}/ 可以匹配 "aa"、"aaa"、"aaaa"。
  • {n,} :表示匹配至少 n 次重复。

    • 示例:/a{2,}/ 可以匹配 "aa"、"aaa" 等。

2.5 特殊符号

  • $ :加在正则表达式后面表示匹配行尾。

    • 示例:/end$/ 匹配以 "end" 结尾的行。

2.6 分组与捕获

  • 分组 :用括号 () 将多个字符组合成一个整体来处理。

    • 示例:/(at)+/ 匹配 "at" 重复一次或多次,如 "at"、"atat" 等。
  • 捕获 :括号 () 也会捕获匹配的文本,可以通过 \1\2 等反向引用捕获的内容。

    • 示例:/(\d+)-(\d+)/ 可以匹配 "123-456",其中 \1 表示 "123",\2 表示 "456"。

2.7 选择

  • | :表示逻辑或,匹配左边或右边的表达式。

    • 示例:/abc|def/ 可以匹配 "abc" 或 "def"。

2.8 前瞻与后顾

  • 正向前瞻(?=...),匹配当前位置后面紧跟指定模式的位置。

    • 示例:/abc(?=def)/ 匹配 "abc",但前提是 "abc" 后面跟着 "def",如 "abcdef" 中的 "abc"。
  • 负向前瞻(?!...),匹配当前位置后面不紧跟指定模式的位置。

    • 示例:/abc(?!def)/ 匹配 "abc",但前提是 "abc" 后面不跟着 "def",如 "abcxyz" 中的 "abc"。
  • 正向后顾(?<=...),匹配当前位置前面紧跟指定模式的位置。

    • 示例:/(?<=abc)def/ 匹配 "def",但前提是 "def" 前面跟着 "abc",如 "abcdef" 中的 "def"。
  • 负向后顾(?<!...),匹配当前位置前面不紧跟指定模式的位置。

    • 示例:/(?<!abc)def/ 匹配 "def",但前提是 "def" 前面不跟着 "abc",如 "xyzdef" 中的 "def"。

三、正则表达式应用示例

3.1 匹配邮箱地址

bash 复制代码
/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/
  • 解释:^ 表示行首,[a-zA-Z0-9_.+-]+ 匹配邮箱用户名部分,@ 是固定字符,[a-zA-Z0-9-]+ 匹配域名部分,\. 匹配点号,最后的 [a-zA-Z0-9-.]+ 匹配顶级域名部分,$ 表示行尾。

3.2 匹配电话号码

bash 复制代码
/^(?:\d{3}-\d{3}-\d{4}|\(\d{3}\) \d{3}-\d{4})$/
  • 解释:^ 表示行首,(?:...) 表示非捕获分组,\d{3}-\d{3}-\d{4} 匹配三个数字加短横线的形式,\(\d{3}\) \d{3}-\d{4} 匹配带括号的形式,$ 表示行尾。

3.3 使用 grep 命令搜索文本

bash 复制代码
grep "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$" contacts.txt
  • 解释:在 contacts.txt 文件中搜索符合邮箱格式的行。

3.4 使用 sed 命令替换文本

bash 复制代码
echo "Hello, World!" | sed "s/World/Everyone/"
  • 解释:将 "World" 替换为 "Everyone",输出 "Hello, Everyone!"。

3.5 使用 awk 命令处理文本

bash 复制代码
echo "Name: John, Age: 30" | awk -F ": " '{print $2}'
  • 解释:使用 : 作为字段分隔符,打印第二个字段,输出 "John" 和 "30"。
相关推荐
小传blog3 分钟前
解决PLSQL工具连接Oracle后无法使用ODBC导入器问题
数据库·oracle
o0向阳而生0o7 分钟前
48、c# 中 IList 接⼝与List的区别是什么?
开发语言·c#·list·.net
小L爱科研10 分钟前
7.6/Q1,GBD数据库最新文章解读
数据库·数据分析·逻辑回归·线性回归·健康医疗
Code哈哈笑15 分钟前
【基于SpringBoot的图书购买系统】深度讲解 分页查询用户信息,分析前后端交互的原理
java·数据库·spring boot·后端·spring·交互
kingwebo'sZone20 分钟前
sqlite的拼接字段的方法(sqlite没有convert函数)
java·数据库·sqlite
阿蒙Amon21 分钟前
C#串口打印机:控制类开发与实战
开发语言·c#
仙袂拂月22 分钟前
C# Windows Forms应用程序-001
程序人生·c#·个人开发·学习方法·visual studio
白总Server28 分钟前
Golang基于 Swagger + JWT + RBAC 的认证授权中间件设计
linux·运维·服务器·架构·go·bash·jwt
熬夜苦读学习40 分钟前
线程封装与互斥
linux·运维·服务器·开发语言·c++
若水晴空初如梦41 分钟前
QT聊天项目DAY12
运维·服务器