- 正则表达式并不关心模式在数据流中的位置。它也不关心模式出现了多少
次 - 正则表达式模式区分大小写
- 在正则表达式中,空格和其他的字符并没有什么区别
基本正则表达式
-
\
禁止转义模式中的特殊字符 -
特殊字符
\s
匹配任意空白符,等价于[ \f\n\r\t\v]
\S
匹配非空白符
\w
匹配数字字母下划线,等价于[A-Za-z0-9\_]
\W
匹配非数字字母下划线
\d
匹配数字,等价于[0-9]
-
^
出现在模式开头时,表示只匹配行首的模式- 出现在模式开头之外的其他位置,那么
^
就跟普通字符一样,不再是特殊字符
- 出现在模式开头之外的其他位置,那么
-
$
出现在模式结尾时,表示只匹配行尾的模式^$
模式可以匹配空白行
-
.
匹配1个字符- 换行符除外
- 空白符也算字符
.at
可以匹配is at
- 必须匹配一个,如果没有字符则模式不存在
.at
不可匹配at home
-
[]
定义了一个字符组- 字符组中的任意字符出现在了数据流中,那它就匹配了该模式
- 必须匹配字符组中的其中一个字符
[^]
定义了排除型字符组- 匹配除了字符组内定义字符外的所有字符
- 包括空白符,但仍然需要匹配到一个字符
- 区间
- 常用区间包括数字和字母:
[1-9]
、[a-z]
、[A-Z]
- 可同时置顶多个不连续区间
- 例子:
[a-ch-m]
,[1-36-9A-Z]
- 例子:
- 常用区间包括数字和字母:
- 特殊字符组
-
*
匹配 0 或多个字符- 放在要匹配的字符后
- 例子:
echo “color” | grep -E “colou*r”
- 例子:
.*
匹配任意数量的字符,包括没有字符- 通常用在数据流中两个可能相邻或不相邻的文本字符串之间
*
还能用在字符组上, 指定可能在文本中出现多次的字符组或字符区间- 例子:
grep -E “b[ae]*t”
- 只要a和e字符以任何组合形式出现在b和t字符之间(就算完全不出现也行),模式就能够匹配
- 但如果出现了字符组之外的字符,该模式匹配就会不成立
- 例子:
- 放在要匹配的字符后
拓展正则表达式
-
awk程序能够识别拓展模式,但sed不能
- 因此awk更慢一些
-
?
匹配0个或1个字符- 与星号一样,可以将问号和字符组一起使用
- 例子:
grep -E “b[ae]?t”
- 如果字符组中的字符出现了0次或1次,模式匹配就成立
- 但如果两个字符都出现了,或者其中一个字符出现了2次,模式匹配就不成立
- 例子:
- 与星号一样,可以将问号和字符组一起使用
-
+
匹配1个或多个字符,但至少出现1次- 加号同样适用于字符组,与星号和问号的使用方
式相同
- 加号同样适用于字符组,与星号和问号的使用方
-
{}
允许为可重复的模式指定上限{m}
表示模式精确出现m次{m,n}
表示模式会出现m-n次之间{m,}
表示模式至少出现m次- 默认awk程序不会识别正则表达式间隔;必须指定gawk程序的
--re- interval
命令行选项才能识别
-
|
用逻辑OR方式匹配的两个或多个模
式- 表达式和管道符号之间不能有空格,否则它们也会被认为是正则表达式模式的一部分
-
()
进行分组- 该组会被视为一个标准字符。可以像对普通字符一样给该组使用特殊字符
- 匹配Saturday或者缩写Sat:
grep -E "Sat(urday)?"
- cat和tab都可以匹配:
(c|b)a(b|t)
例子
# 匹配Saturday或者缩写Sat
Sat(urday)?
# 函数名不得以数字开头
^[^0-9]
# (不以0开头的)正整数
^[1-9][0-9]*
# 1-999的正整数
^[1-9][0-9]{1,3}
# txt后缀的文件
\.txt$
# 空行
^\s*$
# 用户注册表单时,只允许密码包含字符、数字、下划线和连接字符(-),并设置密码的长度区间为6-15
^[1-9a-zA-Z_\-]{6-15}$
# 中文字符串
^[\\u4e00-\\u9fa5]{0,}$
# 日期
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
# 内网IP(包括IPV6)
^(^127\\.)|(^192\\.168\\.)|(^10\\.)|(^172\\.1[6-9]\\.)|(^172\\.2[0-9]\\.)|(^172\\.3[0-1]\\.)|(^::1$)|(^[fF][cCdD])$
# 从文本中提取URL链接
^(f|ht){1}(tp|tps):\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- ./?%&=]*)?
shell通配符
*
匹配 0 或多个字符?
匹配任意一个字符[list]
匹配 list 中的任意单一字符[!list]
匹配 除list 中的任意单一字符以外的字符[c1-c2]
匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z]{string1,string2,...}
匹配 string1 或 string2 (或更多)其一字符串{c1..c2}
匹配 c1-c2 中全部字符 如{1…10}