Regular Expression

From《鸟哥的Linux私房菜——基础学习篇》Part-12

字符编码对正则的影响

语系 编码顺序
LANG=C 0 1 2 3 4 … A B C D … Z a b c d …z
LANG=zh_TW 0 1 2 3 4 … a A b B c C d D …… z Z

使用正则时,需要特别注意运行环境的语系是什么,不同的语系会导致不同结果!!!
使用特殊符号的正则能避免不同字符编码的影响!!!

特殊符号

符号 意义
[:alnum:] 代表英文大小写字符及数字,即0-9,A-Z,a-z
[:alpha:] 代表任何英文大小写字符,即A-Z,a-z
[:blank:] 代表空白键或者[Tab]按键
[:cntrl:] 代表键盘上面的控制按键,包括:CR,LF,Tab,Del
[:digit:] 代表数字而已,即0-9
[:graph:] 除了空白字符(空白键和[Tab]按键)之外的其他所有按键
[:lower:] 代表小写字符,即a-z
[:print:] 代表任何可以被打印出来的字符
[:punct:] 代表标点符号(punctuation symbol),即:",',?,!,;,:,#,$
[:upper:] 代表大写字符,即A-Z
[:space:] 任何会产生空白的字符,包括:空白符,[Tab],CR
[:xdigit:] 代表 16 进位的数字类型,包括:0-9,A-F,a-f

基础RE字符

字符 意义 栗子
^word 待搜寻的字串(word)在行首 行首为 # ^#
word$ 待搜寻的字串(word)在行尾 行尾为 ! !$
. 代表一定有一个任意字符 搜索(eve) (eae) (eee) (e e),但不能是(ee)!即 e 与 e 中间一定有一个字符(包括空白字符) e.e
\ 转义符,将特殊符号的特殊意义去除 搜索单引号 ‘ \'
* 重复零个到无穷多个的前一个 RE 字符 搜索(ef) (efs) (efss)… efs* (注意efs*可以匹配ef)。任意字符则为 .*
[list] 一个待搜索字符的集合,里面列出想搜索的字符 搜索(gl) 或 (gd) g[ld]。 [] 只代表一个待搜索的字符,a[afl]y 代表搜索 aay, afy, aly,即 [afl] 代表 a 或 f 或 l
[n1-n2] 一个待搜索字符的集合,里面列出想搜索的字符的范围 搜索含有任意数字 [0-9]。在 [] 中的减号 - 代表两个字符之间的所有ASCII编码连续字符。所有大写字符则为 [A-Z]
[^list] 一个待搜索的集合,里面列出不要的字符或范围 搜索(oog)或(ood)… 但不能是(oot) oo[^t]。 不要大写字符 [^A-Z]
{n,m} 连续 n 到 m 个的前一个 RE 字符,{n}连续 n 个的前一个 RE 字符,{n,}连续 n 个以上的前一个 RE 字符 搜索(goog)或(gooog) go{2,3}g

扩展RE字符

字符 意义 栗子
+ 重复一个或一个以上的前一个 RE 字符 搜索(god) (good) (goood)… go+g。 o+ 表示一个以上的 o
? 零个或一个的前一个 RE 字符 搜索(gd)和(god) g?d。 o? 表示 0 或 1 个 o
| 逻辑或 or 搜索 gd 或 abc gd|abc
() 符合括号内条件的集合 搜索(glad)或(good) g(la|oo)d
()+ 一个或多个符合括号内条件的集合 搜索AxyzxyzxyzxyzC A(xyz)+Z

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 搜索特定字符
grep -n 'somestring' filename
# 利用中括号 [] 来搜索字符集合
# 搜索 tast 和 test
grep -n 't[ae]st' filename
# 搜索 oo 前不是 g
grep -n '[^g]oo' filename
# 搜索 oo 前不是小写字母
grep -n '[^a-z]oo' filename
grep -n '[^[:lower:]]oo' filename
# 搜索一个任意数字
grep -n '[0-9]' filename
grep -n '[[:digit:]]' filename
# 行首 ^
# 搜索开头为 somestring
grep -n '^somestring' filename
# 搜索开头是小写字母
grep -n '^[a-z]' filename
grep -n '^[[:lower:]]' filename
# 搜索不是英文字母开头
grep -n '^[^a-zA-Z]' filename
# 行尾 $
# 搜索行尾需注意 Windows 下换行符 ^M 的影响
# 搜索行结尾是小数点 . (.需要转义)
grep -n '\.$' filename
# 搜索空行
grep -n '^$' filename
# 任意一个字符 .
# 零个或多个字符 *
# 搜索 g..d,g和d之间有2个字符
grep -n 'g..d' filename
# 搜索至少2个以上的连续 o
grep -n 'ooo*' filename
# 搜索 g开始 d结束 中间任意
grep -n 'g.*d' filename
# 搜索任意数字
grep -n '[0-9][0-9]*' filename
# 限定连续RE字符的范围 {}
# Linux Shell 下 {} 需转义
# 搜索 oo
grep -n 'o\{2\}' filename
# 搜索g和d之间2到5个o
grep -n 'go\{2,5\}d' filename
# 搜索g和d之间2个以上o
grep -n 'go\{2,\}d' filename