元字符
正则表达式12个元字符:
$()*+.?[^{|
注意:没有 ] } - ]} 只有在前面使用了{[才和它成对匹对。其他地方都认为是字面文本。
转义:正则表达式的元字符转义只是在前面加斜杠 。如果有一段元字符要转移。可以使用 Q......E进行转义。 Q 和E 之前的字符会被当做字面文本来对待。
不区分大小写:(?i) (?i)和(?-i)之间的字符不区分大小写。
(?i)[A-F0-9]
不可打印字符,可以通过十六进制匹配:
a 振铃 0x07
e 转义 0x1B
f 换页 0x0C
换行 0x0A
回车 0x0D
水平制表符 0x09
v 垂直制表符 0x0B
匹配多个字符之一:
c[abc]g c[a-f]g c[1-9]g
匹配数字和字母 [a-zA-Z0-9]
反向是不被允许的,如[z-a]
简写:
d [d] 匹配单个数字
D [^d] 匹配不是数字的任意字符
w 匹配单个单词字符
s 匹配任意的空白字符 。包括空格,制表符和换行符。
S 匹配s不能匹配的任意字符
匹配任意字符:
点号 . 匹配任意字符。点号只匹配单个字符。
[sS] 匹配任意字符
如果正则表达式无法启用点号匹配换行符。在点号前面加上模式修饰符。(?s)'.'
匹配起始位置 结束位置
^ 起始位置 如以begin开头 ^begin 或者 Abegin
$ 结束为止 以end结尾 end$ 或者 end endz
^ $ A z 称为定位符。他们不匹配任意字符。只匹配特定位置。
匹配空白行: ^$
匹配完整单词
单词边界 ,匹配一个单词的开始和结束。
例如:jia.txt
My cat is brown
category
wecatwe
bobcat
CAT
good cat
匹配出cat 。 cat jia.txt |grep -E 'cat
非单词边界 B 匹配目标文件中不匹配的位置:
匹配cat,但不是开头:
cat jia.txt |grep -E 'Bcat'
wecatwe
bobcat
匹配cat,但不是结尾:
cat jia.txt |grep -E 'catB'
category
wecatwe
匹配cat,cat在单词中:
cat jia.txt |grep -E 'BcatB'
wecatwe
匹配多个选择分支之一:
| 管道 one|two|three
完整匹配分支中的单词 (one|two|three)
分组和捕获匹配:
分组是通过圆括号来实现的()
例如:
echo "my name is zeng" |grep -E 'nan|zen'
echo "my name is zeng" |grep -E '(nan|zen)'
说明:选择分支nan匹配成功(圆括号内具有最高优先级,最先执行。)接着引擎退出改分组,匹配 失败。
echo "my name is zeng" |grep -E '(nan|zeng)' 是能匹配成功的。说明zen在匹配失败后,再次进入分支匹配。
非捕获分组:
(?: 开始 结束)
在计算捕获分组的左括号来确定序号的时候,不会计算非捕获分组的括号,性能更好。但不会记录分组的后的内容太。以上可以写为:
echo "my name is zeng" |grep -E '(?: nan|zeng)'
捕获分组见【再次匹配先前匹配过的文本】来理解。
带模式修饰符的分组
例如:
gooD(?i:one|WO|NAME) 在()内的内容就成了大小写不敏感。
再次匹配先前匹配过的文本:
例如:我们想找出一个日期。年的后两位和日月相同。如2008-08-08 2009-09-09
dd(dd)-1-1
表示单词定界符
d表示匹配数值。
(dd)先把年的后两位做分组。
1 表示匹配第一个分组
正则表达式在一个完整的单词里面捕获到(dd)分组保存到1号捕获分组。接着匹配-。接着1号分组。。。。
捕获和命名匹配子串
把捕获到的匹配子串分别保存到对应名称。
例如:
(?<year>dddd)-(?<month>dd)-(?<day>dd)
把年月日分别存储在 year month day的子串中。而不是默认的1 2 3 。
把正则表达式的一部分重复多次
{n} 重复之前表达式n次
{n,m} 重复n到m次
{1,} 至少1次以上
{0,} 至少0次以上
d{100} 重复数字100次
[a-f0-9]{1,8} 十六进制整数
正则表达式的注释
例如日期:
1、宽松排列语法:
(?x)d4 #year
- #separator
d{2} #month
- #separator
d{2} #separator
2、(?#comment) 注释方法:
(?#year)d{4}(?#separator)-(?#month)d{2}-(?#day)d{2}
(?x) 放在正则表达式的最开始地方。确保 (?x) 之前不存在任何空格。