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)在行尾
. 代表一定有一个任意字符
\ 转义符,将特殊符号的特殊意义去除
* 重复零个到无穷多个的前一个 RE 字符
[list] 一个待搜索字符的集合,里面列出想搜索的字符
[n1-n2] 一个待搜索字符的集合,里面列出想搜索的字符的范围
[^list] 一个待搜索的集合,里面列出不要的字符或范围
{n,m} 连续 n 到 m 个的前一个 RE 字符,{n}连续 n 个的前一个 RE 字符,{n,}连续 n 个以上的前一个 RE 字符
### 扩展RE字符
字符 意义
:-: :—
+ 重复一个或一个以上的前一个 RE 字符
? 零个或一个的前一个 RE 字符
| 逻辑或 or
() 符合括号内条件的集合
()+ 一个或多个符合括号内条件的集合
### 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