正则

Posted on 2023-09-18 22:16  -=-  阅读(29)  评论(0)    收藏  举报
通配符的区别:
	1.通配符是对文件命名进行匹配的,正则表达式是对文件的内容进行匹配的
	2.正则表达式是要结合grep、sed、awk使用的

文本匹配:用于匹配特定文本模式,例如查找字符串中的子字符串或模式。

数字匹配:用于匹配数字,包括整数、小数等。例如,匹配电话号码、邮政编码或货币金额。

字符类匹配:用于匹配特定字符类,例如字母、数字、空白字符等。可以使用字符类如 \d、\w、\s 来实现。

位置匹配:用于匹配文本的特定位置,例如文本的开头或结尾。可以使用 ^ 来匹配开头,使用 $ 来匹配结尾。

重复匹配:用于匹配重复出现的模式。可以使用量词如 *(零次或多次)、+(一次或多次)、?(零次或一次)等来实现。

字符范围匹配:用于匹配特定字符范围,例如匹配小写字母、大写字母等。可以使用 [...] 来定义字符范围。

分组匹配:用于将模式分组并捕获匹配的内容。可以使用圆括号 (...) 来创建捕获组。

选择匹配:用于从多个可能的模式中选择一个匹配。可以使用竖线 | 来实现选择。

否定匹配:用于匹配不包含特定模式的文本。可以使用 [^...] 来实现否定匹配。

零宽断言:用于在不消耗输入字符串的情况下检查匹配的条件,例如正向查看断言((?=...))、负向查看断言((?!...))等。

自定义字符类匹配:可以根据需要创建自定义字符类,以匹配特定的字符集。

多行匹配:用于在多行文本中匹配模式,例如匹配每行的开头或结尾。

贪婪与非贪婪匹配:用于控制匹配的贪婪程度,可以使用 *、+、? 后面加上 ? 来实现非贪婪匹配。

常见的字符类:

\d:匹配任何数字字符,等同于 [0-9]。

\D:匹配任何非数字字符,等同于 [^0-9]。

\w:匹配任何单词字符,包括字母、数字和下划线,等同于 [a-zA-Z0-9_]。

\W:匹配任何非单词字符,等同于 [^a-zA-Z0-9_]。

\s:匹配任何空白字符,包括空格、制表符、换行符等。

\S:匹配任何非空白字符。

.:匹配除换行符外的任何字符。

[^...]:字符集,匹配其中任何一个字符。例如,[aeiou] 匹配任何元音字母。

[a-z]:匹配字符范围内的任何字符,例如小写字母。

[A-Z]:匹配字符范围内的任何字符,例如大写字母。

[0-9]:匹配数字范围内的任何字符。

[[:alpha:]]:匹配任意字母字符,依赖于 POSIX 字符类的支持。
[[:lower:]]:匹配任意一个小写字母
[[:upper:]]:匹配任意一个大写字母
[[:digit:]]:匹配任意一个数字字符,依赖于 POSIX 字符类的支持。
[[:alnum:]]:匹配任意一个字母或数字字符,依赖于 POSIX 字符类的支持。
[[:space:]]:匹配空白字符,依赖于 POSIX 字符类的支持。
[[:punct:]]:匹配任意一个标点符号


正则中的元字符
一、匹配单个字符
1> . 表示任意一个字符(空格、逗号、字母、数字..)
	例:
		.c
	明:
		匹配两个字符,第一个字符是任意字符,第二个是c,在一行中的任何位置都可以
2> [] 表示范围内的一个字符
	例:用字母和数字方式
		[a-z] [0-9]
	明:过滤包含a-z中任意一个小写字母的行;过滤包含0-9中任意一个小写字母的行

	[:digit:] 表示0-9全部10个数字
	[[:digit:]] 表示0-9中任意一个数字
3> [^] 匹配范围以外的任意一个字符
	grep "[123]" file -->过滤包含1或3或2任意一个数字
	grep "[^123]" file -->过滤包含1..3以外的任意一个字符的行,如果该行只有1-3则不会显示
	grep -v "[123]" file -->过滤不包含1-3任意一个数字的行
	
	#grep "^[123]" file
	#grep -v "^[123]" file ---匹配结果同上相同
4> -A -B -C 显示匹配到行的前后n行
	-A n 显示匹配行后的n行
	-B n 显示匹配行前的n行
	-C n 显示匹配行前后的各n行
5> 次数匹配
	* 表示其前边的字符出现任意次数(0,1,n次)
		例 a*b  -->a可以出现任意次数 aab或者aaaab或者abb
	.* 表示任意一个字符,出现任意多次
	? 表示前边的字符出现0次或最多1次(可能需要\?转译)
	\{n,m\} 表示前边的字符最少出现n次,最多出现m次
		\{n,\} -->表示前边最少n次,最多不限
		\{,m}\ -->表示前边最多m次,最少不限
6> 位置匹配
	^ 表示以后边一个字符开头的行
		// ^test
	$ 表示以后边一个字符开头的行
		// $test
	\< or \b 表示单词首部
		// "\<root" or "\broot" 匹配开头为r的单词
	\> or \b 表示单词尾部
		// "root\>" or "root\b" 匹配结尾为t的单词
	^$ 表示空白行
7>分组
	\( \) 将一个内容当一个整体来看(分组)
	\1    引用前边的第一个分组
	\2	  引用前边的第二个分组

扩展正则:
	grep -E 匹配内容 File
	egrep 匹配内容 File
'''
-E:启用扩展正则表达式,此时你可以使用 () 来分组、| 来表示或逻辑等。

-F:禁用正则表达式,将模式作为普通字符串进行匹配。

-P:启用 Perl 正则表达式,支持更多高级正则表达式语法,包括 \d 等。
'''
	字符匹配
		.	//匹配任意一个字符
		[]	//匹配括号内的任意一个字符
		[^]	//匹配括号内范围以外的一个字符
	次数匹配
		*	//前边的字符出现任意次数
		?	//前面的字符出现0次或1次
		{n,m}	//前面字符最少n,最多m次
		{*}	//里边*指定几次就匹配几次
		+	//匹配前边的字符至少1次
	位置锚定
		^	//匹配以...开头的行首
		$	//匹配以...结尾的行尾
		\< or \b	//单词匹配以..开头的单词
		\> or \b	//单词匹配以..结尾的单词
	分组
		()
		\1
		\2
		##(?: ... )  //1.提高性能 2.去除不需要的分组
		是正则表达式中的非捕获分组。通常,正则表达式中的括号 ( ... ) 用于创建捕获组,这意味着匹配括号内的子表达式的内容将被捕获并可以在匹配后进行引用或检索。而 (?: ... ) 用于创建非捕获分组,其中的子表达式也会被匹配,但不会被捕获,不能在匹配后引用或检索。
	或
		(|)	//匹配|两边的字符
//在基本正则表达式中, ? {} [] 需要在前边使用\进行转义
//在扩展正则表达式中不需要

从文件/etc/file中过滤出包含任意数字的行
	//grep -P "\d" file
	//grep "[[:digit:]]" file #只可以使用基本正则,也就是grep不加参数
	//grep  "[0-9]" file
从文件/etc/file中过滤出包含两个相同数字的行

从文件/etc/file中过滤出包含 两位数 的行
	//grep "[0-9]\{2,\}" file
	//grep -E "[0-9]{2,}" file
	//grep -P "\d{2,}" file
从文件/etc/file中过滤出以 # 开头的行
	//grep "^#" file
从文件/etc/file中过滤出以非 # 开头的行
	//grep -v "^#" file
从文件/etc/file中过滤出以 # 开,以数字为结尾的行
	//grep -E "^#.*\d$" file
	//grep -P "^#.*\d$" file
从文件/etc/file中过滤出以 # 开,以.为结尾的行
	//grep -E "^#.*\.$" file
从文件/etc/file中过滤出包含单词 ct的行(ctrl不能匹配)
	//grep -E "\<ct\>" file
	//grep -P "\bct\b" file
从文件/etc/file中过滤出仅有 # 的行
	//grep -E "^#([[:space:]])*$" file
	//grep -E "^\s*#$" file
	//grep -E "^#*#$" file
从文件/etc/file中过滤出以 # 为开头,并且# 后的第一个非空字符是2或4或6的行
	//grep -E "^#\s*(2|4|6)" file
从文件/etc/passwd中过滤出以/bin/bash结尾行
	//grep "/bin/bash$" /etc/passwd
从文件/etc/passwd中过滤出以 root 或者 bin 开头的行
	//grep -E "^(root|bin)" /etc/passwd
从命令ifconfig enX0的执行结果中过滤出30-457之间的整数
	// ifconfig enX0 | grep  -E "\b[3-9][0-9]\b|\b1[0-9][0-9]\b|\b2[0-9][0-9]\b|\b3[0-9][0-9]\b|\b4[0-5][0-7]\b"
从命令ifconfig enX0的执行结果中过滤出两位数或者三位数
	//grep -E "\b[1-9][0-9]\b|\b[1-9][0-9][0-9]\b"
从命令ifconfig enX0的执行结果中过滤出类似于xxx.xxx.xxx.xxx的ip格式
	//grep -E "\b\d{1,3}(?:\.\d{1,3}){3}\b"
从命令ifconfig enX0的执行结果中过滤出合法的ip地址
	//grep -E -o  'inet ([0-9]{1,3}\.){3}[0-9]{1,3}'