学会这20个正则表达式,常用正则表达式超强整理
学会这20个正则表达式,常用正则表达式超强整理”\>”表示锚定词尾。”liang\>”表示以liang作为词尾的单词将会被匹配到。“\<”表示锚定词首。”\<lao”表示以lao作为词首的单词将会被匹配到。“$”表示锚定行尾,匹配输入字符串的结尾位置。比如”hello$”表示只匹配位于行尾的hello字符串。”^”与”$”分别代表锚定行首与锚定行尾,那么,我们将它们结合在一起使用,”^Linux$”表示Linux既位于行首,同时也位于行尾,换句话说,就是整行中只有一个单词Linux。那么”^$”表示什么意思呢?”^$”就表示行首与行尾相连,换句话说就是空行。”-n”参数可以显示行号,可以看到第5行空行被匹配到了。
正则表达式,又称规则表达式。正则表达式的英语为: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不是词首就会被匹配到,同理”Linux\B”表示只要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地址。
以上就是关于正则表达式的介绍了,相信在工作中你一定会用到它!