您的位置:首页 > 其它

学习笔记:基础正则表达式

2015-10-08 18:04 274 查看
我们知道,正则表达式在程序语言中很常见,灵活应用正则表达式,能帮助我们建立一些编程思维和语法习惯。那么,到底什么是正则表达式呢?

正则表达式的概念:
正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要是用于字符串的模式分割、匹配、查找及替换工作。

其实,在正则表达式中最常用也最主要的是
包含匹配
即:
匹配


不少人在学习正则表达式的时候容易把正则表达式和通配符搞混淆,下面我简要说明一下正则表达式和通配符的几个主要的区别。

(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] 这个范围内的字符,至于等于多少,无所谓。

好了,以上我列举的是一些常见的、基础的正则表达式。其实正则还有很多参数的,只是我一般都不常用也就没有列举。前面也说了,灵活运用正则会为我们带来很多方便。而正则最主要的就是包含匹配,只要把握住这一点多练习几次,很快就可以掌握它啦!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: