正则表达式

正则表达式

正则表达式

目标查找/取出/匹配 符合条件的某个字符或字符串

正则表达式学习方法:单个字符表示>>>字符串表示>>>表达式

正则单字符的表示方法

首先,把/etc/passwd复制到家目录下

1
cp /etc/passwd ~/.

特定字符

某个具体的字符,如:’1’,’a’

示例:

1
grep '1' passwd

范围内字符

  • 数字字符
  • 小写字符
  • 大写字符
  • 大小写字符
  • 符号
  • 反向字符

单个字符 []

数字字符

[0-9],[123] (注意:只是范围内的一个字符)

示例:

1
grep '[0-9]' passwd

小写字符

[a-z]

示例:

1
grep '[a-z]' passwd

大写字符

[A-Z]

示例:

1
grep '[A-Z]' passwd

大小写字符

[a-zA-Z]

示例:

1
grep '[a-zA-Z]' passwd

符号

[,:_]

示例:

1
grep '[,:_]' passwd

反向字符

[^0-9]

示例:

1
grep '[^0-5]' passwd

任意字符

  • 一个点:’.’ (代表任何一个字符)
  • 注意*:’[.]’ 与 ‘.‘ 的效果是一样的

边界字符

  • 头字符
  • 尾字符

头尾字符

^:^root (注意与[^]的区别)
示例:

1
grep '^root' passwd

$:false$
示例:

1
grep 'false$' passwd

空行的表示:^$

首先在家目录下创建一个a.txt文件

1
touch a.txt

输入以下内容:

1
2
3
4
5
6
7
hello world

my name is 寿司卷code

I am very happy to meet you

How are you?

示例:

1
grep '^$' a.txt

元字符

\w:匹配任何字类字符,包括下划线([A-Za-z0-9_])
示例:

1
grep '\w' a.txt

\W:匹配任何非字类字符([^A-Za-z0-9_])
示例:

1
grep '\W' a.txt

\b:代表单词的分隔
示例:

1
grep '\bx\b' passwd

字符表达式的字符组合

字符串

‘root’ ‘1000’ ‘a..c’
‘[A-Z][a-z]’:大写字母与小写字母的组合
示例:

1
grep '[A-Z][a-z]' passwd

‘[0-9][0-9]’:数字与数字的组合
示例:

1
grep '[0-9][0-9]' passwd

这里会有一个问题:会匹配到两位以及两位数以上的数据行

解决办法:

grep ‘\b[0-9][0-9]\b’ passwd

其实用久了我们会发现,上面的这种组合方式非常的繁琐、不方便
有没有更好的办法呢?
当然有!

重复

  • *:零次或多次匹配前面的字符或表达式
  • +:一次或多次匹配前面的字符或表达式
  • ?:零次或一次匹配前面的字符或表达式

首先创建一个测试文件test.txt

touch test.txt

填入以下内容

ab

ababab

abbbbbbbbbb

bbbbbbbbbbb

acccccccc

+ab+ab+

匹配单个字符

示例:

grep ‘ab*’ test.txt
grep ‘ab+’ test.txt
grep ‘ab?’ test.txt

自己可以尝试一下这三个有什么不同之处
下面是我做的测试,高亮的地方就是匹配到的字符

1
grep 'ab*' test.txt

ab
ababab
abbbbbbbbbb
acccccccc
+ab+ab+

1
grep 'ab+' test.txt

+ab+ab+

嘿,是不是发现grep 'ab+' test.txt有问题啊
是的,这个+号需要转义一下,?也是同理

1
grep 'ab\+' test.txt

ab
ababab
abbbbbbbbbb
+ab+ab+

1
grep 'ab\?' test.txt

ab
ababab
abbbbbbbbbb
acccccccc
+ab+ab+

匹配多个字符

如果想要匹配一整个字符呢?
可以用()括起来
示例:

1
grep '\(ab\)*' test.txt

结果:

ab

ababab

abbbbbbbbbb

bbbbbbbbbbb

acccccccc

+ab+ab+

是不是发现其中有空行的存在?
这是因为*包括匹配零次的结果
语句应该这样写:

1
grep '\(ab\)\+' test.txt

结果:

ab
ababab
abbbbbbbbbb
+ab+ab+

重复特定次数

{n,m}:重复n到m次
比如{2,3},在grep中使用就是说匹配重复2次到3次的数据行
示例:

1
grep '[0-9]\{2,3\}' passwd

测试之后会发现确实是匹配到了2次到3次的数据行了,但是其中也包括了三次以上的数据行
这该如何解决呢?
没错,就是你想的那样

1
grep '\b[0-9]\{2,3\}\b' passwd

匹配任意字符串

.表示任何一个字符
示例:

1
grep '^a.*' passwd

这里请注意'^a.*b''^a..b'的区别

这个应该都明白吧?

哎,还是写出来吧…

示例:

1
grep '^a.*b' test.txt

结果:

ab
ababab
abbbbbbbbbb

1
grep '^a..b' test.txt

结果:

ababab
abbbbbbbbbb

这次明白了吧…😓

逻辑表示

| : ‘bin/(bash|nologin)‘
示例:

1
grep 'bin/\(bash\|nologin\)' passwd

结果:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

案例测试

案例一

匹配4-10位QQ号

首先创建一个qq.txt文件

可以填入随意的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
123
1231212414
1414
325313531515
235235235dsdf2
23325325fsffew
24234
234234
23423
12345678900987654x
123321456765456789
123545654567867
2434234234
322332545454
223325545
123dfsw245_heeet
2525
1
grep '^[0-9]\{4,10\}' qq.txt

案例二

匹配15位或18位的身份证号(支持带X)

1
grep '^[0-9]\([0-9]\{13\}\|[0-9]\{16\}\)[0-9xX]$' qq.txt

案例三

匹配密码(由数字,26个字母和下划线组成)

1
grep '^\w\+$' qq.txt

本文标题:正则表达式

文章作者:尚先森

发布时间:2020年09月01日 - 11:55:31

最后更新:2022年07月27日 - 14:03:14

原始链接:https://imauu.gitee.io/2020/09/01/正则表达式/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

尚先森 wechat
有任何问题可以扫描上方二维码私聊我哦😊
您的支持是我创作的最大动力^_^