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