正则表达式

文章目录

        • 通配符?
        • 正则表达式?
        • 哪些程序支持 正则表达式!
        • 正则表达式引擎:
        • 基础正则表达式:
          • ①、字符匹配:
          • ②、匹配次数:
          • ③、位置:
          • ④、分组 和 或者 :
            • 4.1、分组 \\(\\) 的使用例子:
            • 4.2、\1 、 \2 .. 的使用例子:
            • 4.3、或者 "\\|" 的使用例子:
        • 扩展正则表达式:
          • ①、字符匹配:
            • grep -v 与 [^] 的区别:
          • ②、匹配次数:
          • ③ 位置:
          • ④、分组 和 或者:

 


        此链接通往 Shell 编程学习的目录导航 ,从入门到放弃,感兴趣的可以去看看:


 

通配符?

        用来搜索文件的时候用到的,只是搜索文件名,而 正则表达式是通配符的升级,是搜索文件中的内容。

通配符 作用 举例
* 代表任意字符串 *.sh (所有以.sh结尾的文件)
代表单个字符 a?b (acb 或 adb…不可能是 axxb)

       

正则表达式?

正则表达式是为了 处理大量的字符串而定义的一种规则和方法


       

哪些程序支持 正则表达式!

Linux :sed 编辑、 grep 过滤 、awk 显示、vim编辑…

语言: PHP、JAVA、Perl、Python(Perl兼容PCRE)


 

正则表达式引擎:

        专门负责在背后处理正则表达式的程序


       

基础正则表达式:

①、字符匹配:
字符匹配 功能 举例
. 任意 一个 字符 两个 . 即代表任意两个字符
[ ] 匹配指定范围内的任意单个字符 eg:[0-9]、[a-z]、[A-Z]、[a-zA-Z]
[^] 匹配不包含这个范围里任意字符的字符 grep “[^0-9]” filename ; 意为匹配不包括 0-9里任意一个数字 的内容
[.] 放再括号里就表示他自己 相当于 \.
特殊正则表达式 作用 使用
[:alnum:] 任何字母或数字;等于[0-9a-zA-Z] “[[:alnum:]]”
[:alpha:] 任何大小写英文;等于[a-zA-Z] +1
[:lower:] 任何小写字母 +1
[:upper:] 任何大写字母 +1
[:digit:] 任何十进制数字 +1
[:xdigit:] 任何十六进制数字 +1
[:blank:] 空白字符(空格 和 制表符) +1
[:space:] 空白字符(比 [:blank:] 的范围更广) +1
[:punct:] 标点符号 +1
②、匹配次数:
匹配次数 作用 举例
* 匹配前面的字符 "0 ~ 任意次" a*:0次为空,aa、aaa
.* 任意字符任意长度(所有字符) 所有字符
\? 匹配前面的字符 0 or 1 次 0次代表空
\+ 匹配前面的字符最少一次 grep b"\+" (b,bb,bbb…)
\{n\} 重复 前面的字符 n次 使用 egrep、sed -r 可去掉 “\” 号
\{n,m\} 重复前面的字符最少n次,最多m次 同上
\{,n\} 重复前一个字符最多n次 同上
\{n,\} 重复前一个字符最少n次 同上
③、位置:
正则表达式 作用 举例
^ 行首 ^root;root开头的行
$ 行尾 bash $ ;bash结尾的行
^ $ 空行 ^ 和 $ 中间为空格的时候,代表空行
^aaa$ 精准匹配此字符 eg: ^aaa$ ; 代表精确搜索字符aaa
\b 或 \< 词首 用在单词的左侧
\b 或 \> 词尾 用在单词的右侧
\< xxx \> 匹配整个单词 可以理解为"^xxx$"

注意: \b 在左意味着单词的左侧,\b在右为单词的右侧!

④、分组 和 或者 :
正则表达式 作用
\(\) 将一个或多个字符捆绑在一起,当成一个整体处理
\1 、\2… 调用第一个分组 或 第二个分组(类似于变量)
\1 称为 后向引用 \1、\2 表示:将分组的值表达为变量,第一个分组的值为变量1 : \1…
\| 表示或者的意思。a\|b — a 或 b。
4.1、分组 \(\) 的使用例子:
要求: 过滤出 3个连续的 abc:

root@zhengzelin:~# cat zzl.txt
abc
abcabc
abcabcabc
abccc

root@zhengzelin:~# cat zzl.txt | grep -E "abc{3}"    # 注意: 使用 grep -E 的时候,\{\} 可以去掉 \ 符号
abccc
root@zhengzelin:~# cat zzl.txt | grep "\(abc\)\{3\}"
abcabcabc

解释: 如果你使用 abc\{3\} 的话,表示重复 c三次,也就是:abccc
     这里使用 \(\) 将 abc 括起来 当成一个整理来处理,也就是重复 abc这个字符串三次!
4.2、\1 、 \2 … 的使用例子:
\1 表示分组模式的"输出结果",并不是分组模式本身:

root@zhengzelin:~# cat zzl.txt 
123abc456
123abc123
root@zhengzelin:~# cat zzl.txt | grep "\([0-9]\{3\}\).*\1"
123abc123

解释:虽然说 "123abc456" 中的 123456 都符合"[0-9]\{1,3\} " 这个规则!
但是:重点在于 \1 。 这就证明了: "\1 匹配的是分组里的输出结果,并不是匹配规则!"

123abc456   
123abc123   
这两个 "\([0-9]\{1,3\}\)" 的匹配结果是: 123,所以后面的 \1 就是重复一下 123*********************************************************************************************************************************

"☆ 特殊情况:"
eg:  \(string1\+\(string2\)*\)
你会发现 一个大分组 里面 有一个小分组!中间使用 "+" 号连接,这个时候:

分组值变量1 —— \1 : string1\+\(string2\)*
分组值变量2 —— \2 :string2
4.3、或者 “\|” 的使用例子:
a\|b :          表示 a 或者 b。
C\|c :          表示 C 或者 c。
\(C\|c\)at :    表示 Cat 或者 cat !

**********************************************************************************
eg:
root@zhengzelin:~# cat zzl.txt 
cat
Cat
CAT
root@zhengzelin:~# cat zzl.txt  | grep "cat\|Cat"
cat
Cat
root@zhengzelin:~# cat zzl.txt  | grep "\(c\|C\)at"
cat
Cat

# 取两个字符串相同的部分,然后使用分组功能! \(\)

 


 

扩展正则表达式:

使用扩展正则表达式必须使用 : egrep 或 grep -E !


 
①、字符匹配:

与上面基本正则表达式里面的正则表达式一样!

字符匹配 功能 举例
. 任意 一个 字符 两个 . 即代表任意两个字符
[ ] 匹配指定范围内的任意单个字符 eg:[0-9]、[a-z]、[A-Z]、[a-zA-Z]
[^] 匹配不包含这个范围里任意字符的字符 grep “[^0-9]” filename ; 意为匹配不包括 0-9里任意一个数字 的内容
[.] 放再括号里就表示他自己 相当于 \.

 
grep -v 与 [^] 的区别:

[^] 是一个正则表达式,代表不匹配 [ ] 里的字符:
在这里插入图片描述
        根据上图你可以很清楚的看见,数字1是白色的,说明他确实没有被匹配到,结果中红色的部分就是符合你匹配结果的![^1-3] 的意思就是:匹配任意字符,但不包括数字1~3。但是如果某一行包括数字 1~3,它并不会因为过滤掉此行,只会标记此行中的数字 1~3 。(嘴笨不知道如何表达,不好意思。)跟 “grep -v ” 对比一下,你就可以很清楚的看清区别了!
正则表达式_第1张图片
grep -v 会把那些包含数字1或2或3的行都给过滤掉!


 
②、匹配次数:

与 基础正则表达式一样,唯一的区别是不需要使用 “\” 这个符号!

匹配次数 作用 举例
* 匹配前面的字符 "0 ~ 任意次" a*:0次为空,aa、aaa
.* 任意字符任意长度(所有字符) 所有字符
? 匹配前面的字符 0 or 1 次 0次代表空
+ 匹配前面的字符最少一次 grep b"\+" (b,bb,bbb…)
{n} 重复 前面的字符 n次 使用 egrep、sed -r 可去掉 “\” 号
{n,m} 重复前面的字符最少n次,最多m次 同上
{,n} 重复前一个字符最多n次 同上
{n,} 重复前一个字符最少n次 同上

 
③ 位置:
\b 或 \< 词首
\b 或 \> 词尾
\< xxx \> 匹配整个单词

注意:这里使用 grep -E 的时候,"\" 不可以去掉!


 
④、分组 和 或者:
作用
() 将一个或多个字符捆绑在一起,当成一个整体处理
\1 、\2… 调用第一个分组 或 第二个分组(类似于变量)
| 表示或者的意思。a|b — a 或 b。

你可能感兴趣的:(shell,正则表达式,字符串,grep)