正则表达式,又称规则表达式。正则表达式的英语为:Regular Expression,常简写为regex、regexp或RE,是计算机科学中的一个概念。正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本,许多计算机程序设计语言也都支持利用正则表达式进行字符串操作。正则表达式用于字符串处理、表单验证等场合,实用高效,所以我们很有必要去掌握它,本文梳理一些工作中常用的正则表达式,以备不时之需。
本文通过Linux系统中的grep命令来学习正则表达式,当grep与正则结合在一起时,grep就会根据正则表达式的含义在文本中查找出符合条件的字符串。
位置匹配
测试文件1内容如下:
# cat reg1 hello everyone I am laoliang Linux hello Linux I likeLinuxverymuch!
”^”表示锚定行首,匹配输入字符串的开始位置。比如”^hello”表示只匹配位于行首的hello字符串。
“$”表示锚定行尾,匹配输入字符串的结尾位置。比如”hello$”表示只匹配位于行尾的hello字符串。
”^”与”$”分别代表锚定行首与锚定行尾,那么,我们将它们结合在一起使用,”^Linux$”表示Linux既位于行首,同时也位于行尾,换句话说,就是整行中只有一个单词Linux。
那么”^$”表示什么意思呢?”^$”就表示行首与行尾相连,换句话说就是空行。”-n”参数可以显示行号,可以看到第5行空行被匹配到了。
“<”表示锚定词首。”<lao”表示以lao作为词首的单词将会被匹配到。
”>”表示锚定词尾。”liang>”表示以liang作为词尾的单词将会被匹配到。
同理,我们也可以将”<“与”>”结合在一起使用,”<am>”表示当am既是词首又是词尾时则会被匹配到,换句话说,就是当am作为一个独立的单词时,则会被匹配到。
正则表达式中,除了”<“与”>”能够表示锚定词首与锚定词尾以外,我们还可以使用”b”去代替”<“和”>”,”b”既能锚定词首,也能锚定词尾,示例如下:
“B”则与”b”正好相反,”B”是用来匹配非单词边界的,如下”BLinux”表示只要Linux不是词首就会被匹配到,同理”LinuxB”表示只要Linux不是词尾就会被匹配到。
次数匹配
测试文件2内容如下:
# cat reg2 a a a aa aaa aaaaabbb ab abc abcc eaf bf eccf ef eef eeefffff
“{n}” 表示前面的字符连续出现n次,将会被匹配到。比如”a{2}”表示a连续出现两次就会被匹到。
“{x,y}”表示之前的字符连续出现的次数在x与y之间,将会被匹配到。比如”a{2,4}”表示连续出现2次,3次,4次a字母将会被匹配。
“*”表示之前的字符连续出现任意次数(包括0次),将会被匹配到。比如”e*f”表示ef中间e出现任意次将会匹配。
”.”表示匹配任意单个字符。比如”ee..”表示ee后面跟随任意两个字符都会被匹配到,”空格”也算作单个字符所以也会被匹配。
”.*”可以理解为”.”与”*”的结合,表示连续出现任意次的任意单个字符,换句话说就是匹配任意长度的任意字符。比如”a.*”表示a字母后面存在任意长度的任意字符都可以被匹配到。
“?”表示匹配其前面的字符0或1次,也就是前面的字符要么没有要么有一个。比如”abc?”表示ab后面c出现0次或者1次都会被匹配到。
“+”表示匹配其前面的字符至少1次,也就是前面的字符必须有至少一个。比如”abc+”表示ab后面c至少要出现1次才会被匹配到。
字符匹配
测试文件3内容如下:
# cat reg3 a a123 a123b a123$ a123bc456 abcdefg aBdCeFg aBCD a1a3 a#@!
“[[:alpha:]]” 表示匹配任意字母(不区分大小写)。比如"a[[:alpha:]]{3}"表示只有a字母后面跟随了3个字母的字符串才会被匹配到。还有一种方式”[a-zA-Z]”也能表示任意字母。
“[[:lower:]]”表示匹配任意小写字母。比如"a[[:lower:]]{3}"表示只有当a后面的3个字符均为小写字母时,才会被匹配到。还有一种方式”[a-z]”也能表示任意一个小写字母。
“[[:upper:]]”表示匹配任意大写字母。比如"a[[:upper:]]{3}"表示只有当a后面的3个字符均为小写字母时,才会被匹配到。还有一种方式”[A-Z]”也能表示任意一个大写字母。
“[[:digit:]]” 表示匹配任意数字。比如"a[[:digit:]]{3}"表示只有当a后面的3个字符均为数字时,才会被匹配到。还有一种方式”[0-9]”也能表示任意一个数字。
“[[:alnum:]]” 表示匹配任意数字或字母。比如"a[[:alnum:]]{3}"表示当a后面的3个字符为数字或字母时会被匹配到。还有一种方式”[a-zA-Z0-9]”与之等效。
我们可以把上面[[:alpha:]]等拆成两部分理解:
第一部分:最外层的[ ],表示指定范围内的任意单个字符;第二部分:最内层的[:alpha:],表示不区分大小写的字母。“[ ]”就表示匹配指定范围内的任意单个字符的意思。比如"a[bB#3]"表示a后面是b或B或#或3都可以匹配到。
“[^ ]”表示匹配指定范围外的任意单个字符,它与”[ ]”的含义正好相反。比如“[^0-9]”表示匹配单个非数字字符,与[0-9]的含义这正好相反。
转义符
测试文件4内容如下:
# cat reg4 abc a!@# a...bc a*bc
“”与正则中的符号结合在一起时,就表示这个符号本身的含义。比如”.”在正则表达式中代表任意单个字符,如果我们需要匹配字母a后面两个.就需要用到转义符””。
案例
我们需要从ifconfig命令的结果中找出IPv4格式的IP地址,正则表达式可以如下进行编写:
([0-9]{1,3}.){3}[0-9]{1,3}
这里可以分为三部分进行理解:
第一部分”([0-9]{1,3}.)”表示一个最少为1位数字,最多为3位数字的字符串,并且这个字符串后面跟随了一个”.”,我们把这个带有点的数字字符串当做一个整体。第二部分”{3}”表示之前的字符需要连续出现3次,当它与第一部分的正则结合在一起时,表示符合第一部分正则的字符串需要连续出现3次。第三部分的正则为”[0-9]{1,3}”表示一个最少为1位数字,最多为3位数字的字符串。这样我们就匹配出来了IP地址。
以上就是关于正则表达式的介绍了,相信在工作中你一定会用到它!
还没有评论,来说两句吧...