学习笔记:基础正则表达式
Posted the_scent_of_th_soul
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记:基础正则表达式相关的知识,希望对你有一定的参考价值。
我们知道,正则表达式在程序语言中很常见,灵活应用正则表达式,能帮助我们建立一些编程思维和语法习惯。那么,到底什么是正则表达式呢?
正则表达式的概念:
正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要是用于字符串的模式分割、匹配、查找及替换工作。
其实,在正则表达式中最常用也最主要的是包含匹配
即:匹配
。
不少人在学习正则表达式的时候容易把正则表达式和通配符搞混淆,下面我简要说明一下正则表达式和通配符的几个主要的区别。
(1):通配符是用来匹配文件名称的,而正则是用来匹配文件里面的数据的(内容)。
(2):正则是包含匹配(即模糊匹配),而通配符是完全匹配。
(3):grep、awk、sed这些命令是用来操作字符串的,所以它们可以支持正则表达式。而ls、find、cp等等这些是操作文件的命令,它是不能识别正则的,只能识别通配符。
下面是列举的一些基础的正则表达式及其操作:
(1) - * : 前一个字符匹配0次或任意多次。
如果使用命令:“grep "字符*" 文件名”, 它实际上是将整个文件的内容包括空白行全都匹配上了,这样使用该正则表达式其实是错误的,或者说没有任何含义的。
如果你最少需要匹配一个字符的话需要写两次例如:
“grep "aa*" 文件名”
它的意思是说,最少匹配一个a,至于a的后面是什么无所谓。
以此类推:
“grep "aaa*" 文件名”:匹配至少包含两个连续a的字符串
“grep "zxcvbnm*" 文件名”:匹配 至少包含连续的字符串"zxcvbn" 的字符串
(2) - . :匹配除换行符外任意一个字符。
其明确规定有几个"."就必须有几个字符,以用来让其"覆盖".
下面是一个简单的操作实例:
(3) - ^ 和 - $ :"^"匹配行首,"$"匹配行尾。
例如:“grep "^m" 文件名”:表示匹配以小写"m"开头的行。
“grep "n$" 文件名”:表示匹配以小写"n"结尾的行。另外,
"^$":会匹配空白行。可用如下命令查看文件中的空白行:
grep -n "^$" 文件名(-n 用来显示行号)。
(4) - [] :匹配中括号中的 任意 一个字符。
也就是说,括号中的 任意一个字符 只要在文件里出现就会匹配,出现几个匹配几个。如下图操作:
另外,”[0-9]”: 表示匹配任意一个数字。例如我写如下一条命令:
grep "[0-9]" 文件名
它表示将文件中所有的包含数字的行匹配出来。注意,这里的数字实际上是一个个的字符。
例如,文件中的某一行包含一个 -1 那么该正则会将1匹配出来而不去管前面的 “-” 号。也就是说,哪一行有数字,哪一行就会被匹配。
这里还有一点需要注意:在中括号之外加 ^ 表示匹配该中括号范围内的任意字符开头的行。
但是,如果在中括号之内加一个 ^ ,那么它就表示取反,也就是说中括号之内 加和不加 ^ 的效果刚好相反。
具体举例说明见下图:
其中各行命令的解释如下:
grep -n "[0-9]" test.txt :匹配文件中有字符0-9的行。
grep -n "[^0-9]" test.txt:匹配文件中有0-9以外字符的行。
grep -n "^[0-9]" test.txt:匹配文件中以字符0-9开头的行。
grep -n "^[^0-9]" test.txt:匹配文件不以字符0-9开头的行。
至于 “[a-z]” 以及 “[A-Z]” 的匹配与上述 “[0-9]” 的匹配类同,这里就不再赘述。当然,在不同环境中该正则表达式可能会有些异同,需视情况而定。
(5) - \\ :把特殊符号的作用给取消,让其不再使用特殊作用。
比如上面我们讲到.的作用是代表任意一个字符,而用通过\\.的形式时, "."就是"." 。例如:
grep ".$" 文件名 :代表匹配以任意字符结尾的行。
grep "\\.$" 文件名 :代表匹配以字符"."结尾的行。
(6) - \\n\\ :表示其前面的字符恰好出现n次。
这里所说的字符出现必须是连续出现的。详见下图:
图中命令具体解释如下:
grep -n "a\\3\\" test.txt
: 匹配出文件中a字母连续出现三次的字符串 所在的行。
可以发现,从第一个字符开始,只要有三个连续的字符a这三个a就会变红。也就是说,该正则不但会列出 需要匹配的n个连续字符
所在的行,而且会标记出满足条件的连续字符(字符串)所在的位置
。
grep -n "[0-9]\\4\\" test.txt
: 匹配出包含连续四个数字的字符串 所在的行。
上述提到过,这里对数字的处理实际上也是按照字符处理的。从图中字符串 “1237890” 也可以看出,这里的连续数字并不是指数字间的差值相等。而是指它们都是在 [0-9] 这个范围内的字符,至于等于多少,无所谓。
好了,以上我列举的是一些常见的、基础的正则表达式。其实正则还有很多参数的,只是我一般都不常用也就没有列举。前面也说了,灵活运用正则会为我们带来很多方便。而正则最主要的就是包含匹配,只要把握住这一点多练习几次,很快就可以掌握它啦!
以上是关于学习笔记:基础正则表达式的主要内容,如果未能解决你的问题,请参考以下文章