玩转shell-正则表达式深入学习

文章目录

  • 前言
  • 被语系影响的正则表达式
  • 贪婪匹配与非贪婪匹配
  • 要注意的元字符
  • 容易被误解的地方
  • 常用正则
  • 匹配实战

前言

我们在掌握了如下知识的前提下开始进阶正则的学习或者说小复习

  • BRE 和 ERE 的正则基本知识:https://blog.csdn.net/abcnull/article/details/103951287
  • Linux 一些常见的基本命令的使用
  • Linux 三剑客的熟悉了解,因为正则最常用的还是三剑客中的模式匹配

然后我在这里提供一个正则的测试练习网站:在线正则测试

被语系影响的正则表达式

正则表达式匹配竟然还受到 linux 语系的影响?没错确实如此,

  • LANG=C 字符顺序 ABCD,这样我们写 [a-Z] 时候是正常匹配的
  • LANG=zh_CN 字符顺序 aAbBcC,这样我们写 [a-Z] 就会出现匹配结果与预期不同的问题了!

本人通过输入 locale 查看 lang 是 LANG=en_US.UTF-8,使用正则时 ok 的

贪婪匹配与非贪婪匹配

贪婪模式和非贪婪模式本质就是默认最长的匹配还是最短的匹配

比如有表达式abczzzzc,然后我们写几个正则如下

# 贪婪匹配,即趋向于最大长度匹配,将最长的作为默认首选,其他的作为备选。也就是说如果最长没有匹配到会自动匹配次长的
# 匹配到 abczzzzc
ab.*c

# 非贪婪匹配,一旦匹配到就结束了,趋向于最短的匹配,即最短的作为默认首选,其他作为备选,直接在匹配的次数后加上问号
# 匹配到 abc
ab.*?c

# 非贪婪匹配,最终结果可以匹配到 abczzzzc,虽然是非贪婪匹配,默认从最短匹配,但是 2 个匹配不到只能 4 个才匹配得到,但这也是满足条件的
abcz{2,}?c

要注意的元字符

# 匹配单词常用,如“ hello ”中匹配出“hello”
\bhello\b

# 匹配空格
\s

# 匹配一个数字,\d 等价于 [0-9] 等价于 [0123456789]
\d
[0-9]
[0123456789]

# 匹配字母,数字,下划线,汉字,意思就是不匹配除了下划线外乱七八糟的符号
\w

# 表示次数的有如下
{n}
{n,}
{n,m}
?
+
*

容易被误解的地方

# 贪婪匹配和非贪婪匹配,不同只是在于默认取最长还是最短!
只是默认按最长还是最短来匹配,当最长或最短匹配不到时候,会在区间范围内继续匹配!

# []的多次的匹配,是多个随机的值,而不是一个值重复多遍!
[0-9]{3} 是指 3 个数,这三个数是可以相同也可以不相同的,形如 [0-9][0-9][0-9],而不是说同一个数字重复了 3 遍!\d{3} 的逻辑也是一样的!也就是说 {} 或者 * 或者 + 表示把前面表达式抄写了多少遍

# 正则表达式中不要随意加空格,养成良好的编写正则的习惯

# [^] 既不是表示括号中什么以哪一个元素打头,也不是表示括号中随意一个元素不在,而是表示整体取反,比如说下面表示既没有 1 又没有 2 数字,并且中括号里的表示单个字符,下面不是 12,而是 1,2
[^12]

常用正则

# 任意多少个什么字符,可以为 0 个,贪婪匹配最长
.*
# 非贪婪匹配最短
.*?
# 任意多少个什么字符,最少为 1 个,贪婪匹配最长
.+
# 非贪婪匹配最短
.+?

# 代表匹配 n 个,? + * 也都可以表示匹配几个
{n}
# 匹配 n 个或者以上,贪婪匹配
{n,}
# 非贪婪匹配
{n,}?

匹配实战

# 匹配座机号码 0123-5111111,以 0 打头
0\d{3}-\d{7}
0[0-9]{3}-[0-9]{7}

你可能感兴趣的:(#,Shell)