啥子是正则
我在桌面上新建了一个文件,可以搜索出来自己想要的东西:
- 会一个个去匹配
- 有多少个mysql,就能匹配到多少次,我就能回车查看多少次
如果我要查询以mysql开头的记录,我应该怎么搞呢?这个时候我们就要用到正则表达式了:
百度百科定义:
正则表达式,又称 规则表达式。
正则表达式的英语原文为:Regular Expression,常简写为regex、regexp或RE,正则表达式是计算机科学的一个概念。
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
锚定”行首”与”行尾”
grep 进行一个正则的切入点
准备这个文件:
hello world
hi hello
hello ,zsy
- 请看下边:每行都有“hello”,所以都被匹配出来了
- 要打印以“hello”开头的咋个整:来一个正则就行了
- 要打印“world”结尾的呢:
-
“^”在正则中表示锚定行首
-
“$”在正则中表示锚定行尾
-
试试看结合:新增一行内容:hello
- ”^$”表示行首与行尾相连,换句话说,就是”空行”:新增一个空行试试
锚定”词首”或”词尾”
正则表达式中,”\<“表示锚定词首,”\>”表示锚定词尾
- 锚定词首:很简单撒,单词开头的
- 锚定词尾:
- 一起使用试试:其实就是匹配了一个独立的单词
- 还可以使用”\b”去代替”\<“和”\>”,”\b”既能锚定词首,也能锚定词尾:
- “\B”是用来匹配”非单词边界”的,与“\b” 不一样:以下比方意思就是只要开头不是hello,都会被匹配到
^:表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。
$:表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配。
^$:表示匹配空行,这里所描述的空行表示”回车”,而”空格”或”tab”等都不能算作此处所描述的空行。
^abc$:表示abc独占一行时,会被匹配到。
\<或者\b :匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现。
\>或者\b :匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现。
\B:匹配非单词边界,与\b正好相反。
连续次数的匹配
准备的文件内容:
[root@whale scripts]# cat regex
a a a
aaaa aaaaaaa
aaaaaaa aaaaa
bb bbcc da d
ef edf ecf
aaa aa aaaa
a
[root@whale scripts]#
按照我们所知道,要匹配上述内容的连续几个a应该怎么匹配法呢:显示我们一点不专业
那就来一个专业的吧:”\{2\}”就表示”连续出现2次”
“\{x,y\}”表示之前的字符至少连续出现x次,最多连续出现y次,
:请看下边
-
\{x,\}表示之前的字符至少连续出现x次,或者连续出现次数大于x次,即可被匹配到,上不封顶。
-
\{,y\}表示之前的字符至多连续出现y次,或者连续出现次数小于y次,即可被匹配到,最小次数为0次
常用字符
.
正则表达式中,“.”匹配任意单个字符(除了换行符外):
匹配特殊字符
我们进一步可以对任意字符进行限制:修改一下我们的文件内容,这样好操作一些:
[root@whale scripts]# cat regex
ef edf ecf
avdsfjkDAHKASHD3214
AAabcd3242cd
dad234 aa3234
aaADC234
AAaa4423
bcdaa
[root@whale scripts]#
比如:我们现在不匹配任意字符,要匹配后面必须是字母:[[:alpha:]] 表示”任意字母”(不区分大小写)
- 请看下边的一个正则组合:a后面跟着3或4个字母;我好像悟了
- 继续来:[[:lower:]]表示“任意小写字母”
- 继续:任意大写字母
还有很多:
[[:alpha:]] 表示任意大小写字母 等价于:[a-zA-Z]
[[:lower:]] 表示任意小写字母
[[:upper:]] 表示任意大写字母
[[:digit:]] 表示0到9之间的任意单个数字(包括0和9)等价于:[0-9]
[[:alnum:]] 表示任意数字或字母
[[:space:]] 表示任意空白字符,包括”空格”、”tab键”等。
[[:punct:]] 表示任意标点符号
[]的特殊含义
从上述的规则中我们发现了特殊一个东西:[]
“[ ]”表示匹配指定范围内的任意单个字符,不理解就看下边:
- 请看这个:意思就是匹配aA\bA\cA\dA其中的一种
演变出来的还有:[^]:表示匹配指定范围外的任意单个字符
- 看一下:大师,我悟了
所以上述的[]符号都可以加^
表示另一层意思了:
[^a-z]表示非小写字母的单个字符可以被匹配到。
[^A-Z]表示非大写字母的单个字符可以被匹配到。
[^a-zA-Z]表示非字母的单个字符可以被匹配到,比如数字或符号。
[^a-zA-Z0-9]表示非字母、非数字的单个字符可以被匹配到,比如符号。
[^0-9]与[^[:digit:]]等效
[^a-z]与[^[:lower:]]等效
[^A-Z]与[^[:upper:]]等效
[^a-zA-Z]与[^[:alpha:]]等效
[^a-zA-Z0-9]与[^[:alnum:]]等效
还有一些简写格式,我不想悟了:
\d 表示任意单个0到9的数字
\D 表示任意单个非数字字符
\t 表示匹配单个横向制表符(相当于一个tab键)
\s表示匹配单个空白字符,包括”空格”,”tab制表符”等。
\S表示匹配单个非空白字符。
分组和后向引用
分组
请看这个比方:这个意思是要匹配o两次,但是这个针对的是单个字符,如果我要匹配两次hello呢?
所以有个分组:很明显\( \)
就表示分组。
分组嵌套
再准备一个文本内容:
[root@whale scripts]# cat regex
abefef
abefefabefef
[root@whale scripts]#
- 这下面是个啥?
- 2次连续出现的abefef被匹配到,悟到了么?
后向引用
后向引用是在分组的前提下才有的
重新准备一个文本内容:
[root@whale scripts]# cat regex
Hello world Hello
Hiiii world Hiiii
[root@whale scripts]#
- 我们要匹配上述两行文字:这个还是会
- 再改一下文本内容后新增一个要求:world 前后的单词要一样
- 显然上述的操作就不符合了
- 第二个比方就可以了:在原来的基础上添加了分组
- “\1″表示整个正则中第1个分组中的正则所匹配到的结果
上大佬的图:
这就是”后向引用“
如果是嵌套分组,根据分组符号的左侧部分排序,进行\1 \2 \3的排序
转义符
准备一个文件内容:
[root@whale scripts]# cat regex
bae
a1#
ddd
a-!
ccc
a..
[root@whale scripts]#
-
匹配一个:
-
我现在要匹配的内容:a开头后面跟着两个.的
这个时候就用到了反斜杠\:“\”与正则中的符号结合在一起时,就表示这个符号本身的含义
- 再看几个:
- 那匹配问好?加号也需要加么?肯定不需要了撒,直接匹配即可
- 如果匹配反斜杠本身,前面再加一个反斜杠就行了
扩展正则表达式
以下内容在扩展正则也是通用的:
. 表示任意单个字符。
* 表示前面的字符连续出现任意次,包括0次。
.* 表示任意长度的任意字符,与通配符中的*的意思相同。
\ 表示转义符,当与正则表达式中的符号结合时表示符号本身。
[ ]表示匹配指定范围内的任意单个字符。
[^ ]表示匹配指定范围外的任意单个字符。
[[:alpha:]] 表示任意大小写字母。
[[:lower:]] 表示任意小写字母。
[[:upper:]] 表示任意大写字母。
[[:digit:]] 表示0到9之间的任意单个数字(包括0和9)。
[[:alnum:]] 表示任意数字或字母。
[[:space:]] 表示任意空白字符,包括"空格"、"tab键"等。
[[:punct:]] 表示任意标点符号。
[^[:alpha:]] 表示单个非字母字符。
[^[:lower:]] 表示单个非小写字母字符。
[^[:upper:]] 表示单个非大写字母字符。
[^[:digit:]] 表示单个非数字字符。
[^[:alnum:]] 表示单个非数字非字母字符。
[^[:space:]] 表示单个非空白字符。
[^[:punct:]] 表示单个非标点符号字符。
[0-9]与[[:digit:]]等效。
[a-z]与[[:lower:]]等效。
[A-Z]与[[:upper:]]等效。
[a-zA-Z]与[[:alpha:]]等效。
[a-zA-Z0-9]与[[:alnum:]]等效。
[^0-9]与[^[:digit:]]等效。
[^a-z]与[^[:lower:]]等效。
[^A-Z]与[^[:upper:]]等效
[^a-zA-Z]与[^[:alpha:]]等效
[^a-zA-Z0-9]与[^[:alnum:]]等效
^:表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。
$:表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配。
^$:表示匹配空行,这里所描述的空行表示"回车",而"空格"或"tab"等都不能算作此处所描述的空行。
^abc$:表示abc独占一行时,会被匹配到。
\<或者\b :匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现。
\>或者\b :匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现。
\B:匹配非单词边界,与\b正好相反。
grep 使用扩展正则方式:-E
选项即可
区别:
在基本正则表达式中,\{n\} 表示前面的字符连续出现n次,将会被匹配到。
在扩展正则表达式中,{n} 表示前面的字符连续出现n次,将会被匹配到。
在基本正则表达式中,\( \) 表示分组,\(ab\) 表示将ab当做一个整体去处理。
在扩展正则表达式中,( ) 表示分组,(ab) 表示将ab当做一个整体去处理。
( ) 表示分组
(ab) 表示将ab当做一个整体去处理。
\1 表示引用整个表达式中第1个分组中的正则匹配到的结果。
\2 表示引用整个表达式中第2个分组中的正则匹配到的结果。
? 表示匹配其前面的字符0或1次
+ 表示匹配其前面的字符至少1次,或者连续多次,连续次数上不封顶。
{n} 表示前面的字符连续出现n次,将会被匹配到。
{x,y} 表示之前的字符至少连续出现x次,最多连续出现y次,都能被匹配到,换句话说,只要之前的字符连续出现的次数在x与y之间,即可被匹配到。
{,n} 表示之前的字符连续出现至多n次,最少0次,都会陪匹配到。
{n,}表示之前的字符连续出现至少n次,才会被匹配到。
扩展正则中常用的符号:“|”
“|”在扩展正则表达式中,表示”或”
- 请看这个比方就知道了: