本文学习总结linux系统下的正则表达式;本文总结了朱双印的正则表达式成果。传送门
正则表达式总结:
一、匹配“行”:
---- 匹配行首字符串:“^” ; 举例: grep --color "^hello" re.txt //匹配以“hello”开头的行;
---- 匹配行尾字符串:“$”; 举例: grep --color "hello$" re.txt //匹配以 "hello"结尾的行;
二、匹配“词”:
---- 匹配“词首”:" 或者 < ";
---- ---- 举例: grep --color "hello" re.txt //匹配以hello开头的单词;
---- 匹配“词尾”:" 或者 > ";
---- ---- 举例: grep --color "hello>" re.txt //匹配以hello结尾的单词;
---- 匹配“单词”:" 或<> " ; //匹配完整单词 ;
---- ---- 举例:grep --color "" re.txt // 匹配单词hello;
---- 匹配“非单词边界”(字符边界)(非词首): " B "(含义:包含字符串,但不在词首);
---- ---- 举例:grep "Bhello" re.txt //匹配单词包含hello,但hello不在词首;
---- 匹配“非单词边界”(非词尾):" B "(含义:包含字符串,但不在词尾);
---- ---- 举例:grep "helloB" re.txt //匹配单词包含hello,但hello不在词首;
---- 说明:" B = [^] " // ^此符号含义为“非”;B 是以单个“字符”为边界;证。
-------- 举例:grep "BerB" re.txt // 匹配er既不在词首也不再词尾的字符串。匹配never,不匹配ever,eraser;
三、连续次数匹配:
---- 匹配字符连续出现n次的行: " {n} "
---- ---- 举例:grep "m{3}" re.txt //匹配m连续出现3次的行;
---- 匹配字符连续出现多次的行:" {n,m} ";//大括号之前的字符至少连续出现n次,最多连续出现m次。
---- ---- 举例:grep "o{2,3}" re.txt // 匹配字母o连续出现至少2次至多3次的行;
---- 连续出现的字符上不封顶:" {n,} " //至少出现n次;
---- ---- 举例: grep "o{3}" re.txt // 匹配至少连续出现3次o的行;
---- 连续出现的字符至多m次: " {,m} "
---- ---- 举例:grep "o{,3}" re.txt //匹配字符o出现0次~3次的行;
---- 匹配 *前字符 连续出现 任意次数(含0次):" * " ;
---- ---- 举例: grep "o*" re.txt //匹配o连续出现任意次数,含0次;
---- 匹配任意长度的字符串:" .* "
---- ---- 举例: grep "o.*" re.txt //匹配含有o的任意字符串;
---- 匹配任意单个字符: “ . ”
---- ---- 举例: grep "x.x" re.txt //匹配3个字符两边是x,中间是任意字符;
---- 前面的字符出现0次或1次:“ ? ”// 前面字符至多出现1次;
---- ---- 举例: grep "a?" re.txt // 匹配a至多出现一次的行;
---- 前面字符至少出现1次,多了不限:“ + ” //前面的字符至少出现一次;
---- ---- 举例: grep "u+" re.txt //匹配u至少出现1次的行;
四、常量符号:
---- 任意一个字母,不区分大小写:“[[:alpha:]]”
---- ---- 举例: grep "3[[:alpha:]]{3,5}" re.txt // 匹配3后面有3~5个字母的行;
---- 任意一个小写字母:“ [[:lower:]]”
---- ---- 举例:grep "3[[:lower:]]+" re.txt // 匹配3后面至少有一个小写字母的行;
---- 任意一个大写字母:“ [[:upper:]] ”
---- ---- 举例: grep "3[[:uper:]]?" re.txt // 匹配3后面有0个或者1个大写字母的行;
---- 任意一个数字:“[[:digit:]]”
---- ---- 举例:grep "[[:digit:]]+" re.txt // 匹配至少出现一个数字的行;
---- 任意一个数字或字母:“[[:alnum:]]”
---- ---- 举例:grep "[[:alnum:]]?" re.txt // 匹配至多出现一个字母或数字的行;
---- 表示任意空白字符,包括“空格”、“tab键”等:[[:space:]]
---- ---- 举例:grep "[[:space:]]?" re.txt // 匹配至多一个空白字符或tab;
---- 表示任意标点符号:[[:punct:]]
---- ---- 举例:grep "[[:punct:]]?" re.txt // 匹配至多一个标点符号;
-- 总结:
---- [ ]:表示匹配这个“[]”范围内的任意“单个”字符;
---- [^ ]:表示匹配这个“[ ]”范围以外的任意“单个”字符;
---- [] 和 [^]是相对的,[^ ]相当于[]取反;
---- ---- [[:alpha:]]:
---- ---- ---- 最外层[]:表示指定范围内的任意单个字符;相当于开头的[];
---- ---- ---- 最内层[:alpha:] :表示所有“大写字母和小写字母”组成的集合;
---- 等价任意字符:
---- ---- [0-9]等价[[:digit:]]:表示任意的单个“数字”字符;
---- ---- [a-z]等价[[:lower:]]:表示任意单个“小写字母”字符;
---- ---- [A-Z]等价[[:upper:]]:表示任意单个“大写字母”字符;
---- ---- [a-zA-Z]等价[[:alpha:]]:表示任意单个“字母”字符;
---- ---- [a-zA-Z0-9]等价[[:alnum:]]:表示任意单个“字母和数字”字符;
---- ---- [^ a-z]:表示“非小写字母”的单个字符可以被匹配到;
---- ---- [^ A-Z]:表示“非大写字母”的单个字符可以被匹配到;
---- ---- [^ a-zA-Z]:表示“非小写字母和非大写字母”的单个字符可以被匹配到,比如匹配单个“数字”,“符号”;
---- ---- [^ a-zA-Z0-9]:表示“非字母、非数字”的单个字符可以被匹配到,比如匹配单个字符“符号”;
五、分组及后向引用:
-- 分组符号:( )
-- -- ( ):表示将括号其中的内容看作一个分组,即括号中的内容看作一个整体;
-- -- -- -- 举例:grep -n --color "(h.l{2}.) world 1" re.txt // 文字解释繁杂,自己琢磨吧;
-- -- -- -- -- “1”:表示引用整个正则中第一分组中的正则所匹配的结果;
-- -- -- -- -- “2”:表示引用整个正则中第二分组中的正则所匹配的结果;
-- -- 嵌套分组:grep --color "(1 (2 ) ) 1 2" re.txt
-- -- -- -- 分组顺序:分组的顺序取决于分组符号的左侧部分的顺序;
-- -- -- -- -- -- 嵌套分组由外到内,1~n;最外层为“分组1”,最内层为“分组n”;
-- -- -- -- -- -- 最左侧第一个括号,为“分组1”;
-- -- -- -- -- -- 最左侧第二个括号,为“分组2”;
-- -- -- -- -- -- 1 :引用第一分组;
-- -- -- -- -- -- 2 :引用第二分组;
六、转义字符:
-- 转义字符“”: 转义字符功能,表示有“特殊意义”的字符转化成“普通”字符;
-- -- 转义字符“.”:转义后只表示普通的字符“.”;未转义前“.”,表示任意的单个字符;
-- -- 转义字符“*”:转义后只表示普通的字符“*”;未转义前“*”,表示连续引用“*”前面字符任意次数量;
-- -- 转义字符“?”:转移后只表示普通字符“?”;未转义前“?”,表示引用“?”前面字符0次或1次();
-- -- 转移字符“+”:转义后只表示普通字符“+”;未转义前“+”,表示引用“+”前面字符1次到n次(至少1次);
-- -- 转移字符“\”:转义后只表示普通字符“”;未转义前“”,表示“转义符号”;
七、基本正则表达式小结:
---- ---- 常用符号
. -- 表示任意单个字符;
* -- 表示“*”前面的字符连续出现任意次数,包括0次;
.* -- 表示任意长度的任意字符,与通配符中的“*”的意思相同;
-- 表示转义字符,当与正则表达式中的符号结合时表示符号本身;
[ ] -- 表示匹配指定范围内的任意单个字符;
[^ ] -- 表示匹配指定范围外的任意单个字符;
---- ---- 单个字符匹配相关:
[[:alpha:]] -- 表示任意单个大小写字母;
[[:lower:]] -- 表示任意单个小写字符;
[[:upper:]] -- 表示任意单个大写字母;
[[:digit:]] -- 表示0~9之间的任意单个数字;
[[:alnum:]] -- 表示任意单个数字或字母;
[[:space:]] -- 表示任意单个空白字符,包括“空格”、“tab键”;
[[:punct:]] -- 表示任意单个标点符号;
[^[:alpha:]] -- 表示单个非字母字符;
[^[:lower:]] -- 表示单个非小写字母字符;
[^[:upper:]] -- 表示单个非大写字母字符;
[^[:digit:]] -- 表示单个非数字字符;
[^[:alnum:]] -- 表示单个非数字非字母的字符;
[^[:space:]] -- 表示单个非空白字符;
[^[:punct:]] -- 表示单个非标点符号字符;
[ 0-9 ] 与 [[:digit:]] 等效;
[ a-z ] 与 [[:lower:]] 等效;
[ A-Z ] 与 [[:upper:]] 等效;
[ a-zA-Z ] 与 [[:alpha:]] 等效;
[ a-zA-Z0-9 ] 与 [[:alnum:]] 等效;
[^ 0-9 ] 与 [^[:digit:]] 等效;
[^ a-z ] 与 [^[:lower:]] 等效;
[^ A-Z ] 与 [^[:upper:]] 等效;
[^ a-zA-Z ] 与 [^[:alpha:]] 等效;
[^ a-zA-Z0-9 ] 与 [^[:alnum:]] 等效;
---- ---- 简短格式(部分解析器识别):
d -- 表示任意单个0~9的数字;
D -- 表示任意非数字字符;
-- 表示匹配单个横向制表符(相当于一个tab键);
s -- 表示匹配单个空白字符,包括“空格”、“tab键”;
S -- 表示匹配单个非空白字符;
---- ---- 次数匹配相关:
? -- 表示匹配“?”前面的字符0或1次;
+ -- 表示匹配“+”前面字符至少一次,或者连续匹配多次,连续次数上不封顶;
{n} -- 表示匹配“{ }”前面字符连续出现n次,将会被匹配到;
{n,m} -- 表示匹配“{}”前面字符连续出现n~m次之间;
{,m} -- 表示匹配“{}”前面字符连续出现m次,最少0次,都会匹配到;
{n,} -- 表示匹配“{}”前面字符连续出现至少n次, 才会被匹配到;
---- ---- 位置边界匹配相关:
^ -- 表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配;
$ -- 表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配;
^$ -- 表示匹配空行,这里所描述的空行表示“回车”,而“空格”或“tab”等都不能算作此处所描述的空行;
^abc& -- 表示abc独占一行时,会匹配到;
<或者:匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现;
>或者:匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现;
B -- 表示匹配非单词边界,与正好相反;
-------- 举例:grep "BerB" re.txt // 匹配er既不在词首也不再词尾的字符串。匹配never,不匹配ever,eraser;
---- ---- 分组与向后引用
() -- 表示分组符号,我们可以将其中的内容当作一个整体;分组可以嵌套,由外到内,分组编号为1~n;
(ab) -- 表示将ab当做一个整体去处理;
1 -- 表示引用整个表达式中的第一个分组中的正则匹配到的结果;
2 -- 表示引用整个表达式中的第二个分组中的正则匹配到的结果;
八、扩展正则表达式
-- 去掉“基本正则表达式”中的转义字符“”;
-- "com|cn|gov" ("|"含义为'或'):多个表达式中,只出现一个;相当于"[(com)(cn)(gov)]";
-- "grep -E "相当于 "egrep"。