正则表达式解析_学习笔记

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介:

时间:2017.11.20

作者:李强

参考:man,info,magedu讲义

声明:以下英文纯属个人翻译,英文B级,欢迎纠正,以下内容纯属个人理解,并没有对错,只是参考,盗版不纠,才能有限,希望不误人子弟为好。


1、使用目的与场景

一些命令都会使用到查询和匹配一些东西的时候,而正则表达式的过滤功能就可以被调用。

比如grep,find -regex ,vi ,等

2、官方说明

grep: Global search REgular expression and Print out the line 

作用:文本搜索工具,根据用户指定的“模式”对目标文 本逐行进行匹配检查;打印匹配到的行 

模式:由正则表达式字符及文本字符所编写的过滤条件


3、写在前面

通配符是用来匹配文件名时使用的,在命令里一般都可以使用比如ls,grep的参数file都可以是用通配符表示

正则表达式是针对字符使用的,但是正则表达式在ls里就没法使用,

使用正则表达式的工具有grep,sed,awk,wim,less,Nginx,varnish等

正则表达式(regular expressions)有:基本正则表达式BRE;扩展正则表达式ERE

正则表达式中有元字符的概念,

元字符分类:字符匹配,匹配次数,位置锚定,分组

man 7 regex    regular expressions正则表达式

man 7 glob 通配符



4、涉及文件及变量


5、用法

1
2
3
4
5
6
NAME
        grep egrep fgrep  - print lines matching a pattern
 
SYNOPSIS
        grep  [OPTIONS] PATTERN [FILE...]
        grep  [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

这个FILE可以是好多种的文件,比如dpdc,-r 还可以用glob来表示。

我觉得理解这个概念,可以在此处放一个windows下的查找替换功能的窗口。

你想要什么操作就是option选项,你想要过滤什么内容就用正则表达式( ERE|BRE )

感觉正则表达式就像管道,左边进右边出,一次输入一行内容,然后根据匹配条件,

一个字符一个字符找,找到了匹配条件,取出字符,print为一行,然后再去匹配,取出字符,print为一行


grep 参数表

Matcher Selection:

-E
egrep -F fgerp -G (默认)使用BRE -P
Matching Control: -e

-e可以跟多个pattern,各个pattern之间待验证。

另外就是可以查找-开始的字符不会当做参数操作而是当做pattern,而不用去加引号转义符\-

 -f 从文件中获取patterns模式,每行一个 -i 忽略大小写 -w

--word-regexp 输出指定词组的行,词组成成分是字母数字和下划线

,如果有其他特殊字符也会匹配这个要注意使用的场景,最好加双引号 “” ,\用[\]表示,()用\(\),具体还要分析

-v 反转匹配的结果,选择非匹配行打印出来
-x --line-regexp 只选择那些与整行完全匹配的匹配项 -y 已过时的选项,-i的同义词

  General Output Control:

-c 禁止正常输出;相反,为每个输入文件打印匹配行计数。
--color=auto,always,never 默认auto -L 找出来那个文件里不存在匹配的内容就打印出文件名可以被管道符当stdin使用 -l 和-L相反,打印出存在匹配的内容的文件名,可以被管道符当stdin使用 -m 最多只显示出查找到的几行,并不都显示出来。 -o

只打印匹配行的匹配部分(非空部分),将每个此类部分放在单独的输出行上

。比如我想知道/etc/passwd 一共有多少个bash字符,那么就可以使用这个选项然后uniq -c 

-q 如果成功不输出到STDOUT,但是错误会显示错误信息。这里也是>是没用的,2>可以 -s 不管对错都不输出任何信息。注意的是不输出任何信息,> 2> 并没有作用
Output Line Prefix Control: -b 对于文件行首开始,每个匹配项到行首的位置,第32个字符,第65个字符之类的,好像
-H (默认)当有多个搜索文件存在时,打印每个文件名 -h (默认)单只搜索一个文件时,不打印文件名
-n 打印文件中匹配的行,并且将文件中是哪行的行号也一起打印 -T 看不懂,方正加了之后格式就不会因为Hnb参数改变了
-u
-z 也看不懂,-lz然后“”print(.*)“”然后输出结果,打印出文件名,说明在文件中匹配到了,可以跨行来查找好像。
 Context Line Control:(参数后跟数字) -A --after-context=NUM 打印匹配行并且往后显示多少行
-B --before-context=NUM  打印匹配行并且往前显示多少行 -C --context=NUM 打印匹配行并且上下显示多少行


File and Directory Selection -a
-H
-D
-d

 --exclude=GLOB
--exclude-from=FILE
--include=GLOB
 --exclude-dir=DIR -r 如果grep跟的是目录那么递归去查询目录下的所有文件是否包含pattern内容。 -R


字符匹配:

字符匹配怎么匹配一个字符串string不是characters,

默认比如写abc就是匹配包含有abc这个字符串的行

. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符
[^] 取反的意思
字符类character class
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母
[:upper:] 大写字母
[:blank:] 空白字符(空格和字符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃、、、)
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号

注意:-w,匹配单词时一定要注意的,默认不使用正则表达式的字符不加选项,

表示查找匹配包含这个字符串的行


匹配次数:

用在要指定次数的字符后面,用于指定前面的字 符要出现的次数 

* 匹配前面的字符任意次,注意这里只是前面的字符,任意次就是0-∞
\? 匹配前面的字符0或者1次,0|1
\+ 匹配前面的字符至少1次,1-∞
\{n\} 匹配前面的字符n次
\{n,\} 匹配前面的字符至少n次
\{,m\} 匹配前面的字符最多m次
\{n,m\} 匹配前面的字符至少n次,最多m次


位置锚定:

行位置锚定
^ 行首
$ 行尾
^$匹配空行,^[[:space:]]*$匹配非空空白行
单词位置锚定
\< 词首
\> 词尾
\b 词起始位
\<pattern\>或者\bpattern\b但是因为有b这个单词所以还是\<\>适用广些
分组,后向引用,或
\(\) 将一个或多个字符捆绑在一起,当作一个整体进 行处理,如:\(root\)\+
后向引用 后面使用\1 \2来调用前面的第几个\(pattern1\)匹配到的字符,从左往右数,第几个小括号就是几
\| 字符或之间的关系,例如a\|b  a或b     C\|cat   C或cat   \(C\|c\)at     Cat或cat  


6、实际应用分析

1、这里PATTERN什么时候使用单引号和双引号和反向单引号呢

总之用双引号然后遇到需要转义的字符就加\,反向单引号用来调用命令,和平时查不多,最好不用单引号


2、如果要使用特殊字符本身

用转义字符表示

? 表示重复匹配0次或1次\?

+   表示重复匹配1次以上\+

[]   表示匹配[]里的任意单个字符

{}   表示这个{}要用\字符去转义 \{ \}

其他和正常一样写{n}{n,}{,m}{n,m}差不多的写法,不同的是这里表达的含义是匹配的次数而已

{n}表示的就是匹配n次,{n,}表示匹配至少n次,{,m}表示匹配最多m次,{n,m}表示匹配次数最少n次,最多m次。

()

这个东西在正则表达式就是如上\(   \) ,

然后在grep中对这个有个操作是会把()匹配的字符当做是一个变量从前往后1,2,.....,

可以用\1 \2去调用第几个()匹配的字符

|

表示或者的意思,也要用\转义,就是\|

\(a\|b\) 代表意思就是a或者b


因为 ? + {}()需要被转义,因此正常使用就是说的这个字符本身了。

相反\  *  - [] 不需要被转义,如果要使用需要用\转义来代表本身 \\ \*  \[\]

因为. 有含义,所以使用.需要被转义\.


3、grep和egrep的区别

加了转义字符\,好麻烦,所以egrep

egrep和grep区别在于不用\来转义{} () ? + |

4、pattern的一些组合

[lq@centos6 ~]$ifconfig | egrep -o  "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-2][0-2])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>"

主机可用IP地址:1-223|0-255|0-255|1-254,[]()\.等的组合用法



本文转自 lajifeiwomoshu 51CTO博客,原文链接:http://blog.51cto.com/lajifeiwomoshu/1983678

相关文章
|
7月前
|
JavaScript 前端开发 Java
正则表达式深度解析:匹配任意字符串
【4月更文挑战第1天】
3577 0
|
7月前
|
JavaScript 前端开发 Java
|
7月前
|
机器学习/深度学习 前端开发 Windows
【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式(Regular Expression)的开发手册(正则符号深入解析 )
【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式(Regular Expression)的开发手册(正则符号深入解析 )
85 0
|
7月前
|
XML Java 数据库
【后台开发】TinyWebser学习笔记(3)HTTP连接与解析
【后台开发】TinyWebser学习笔记(3)HTTP连接与解析
179 4
|
7月前
|
JavaScript 前端开发 Java
正则表达式深度解析:匹配制表符
【4月更文挑战第2天】
507 2
正则表达式深度解析:匹配制表符
|
7月前
|
数据处理
正则表达式详解:解析星号的含义
【4月更文挑战第3天】
893 1
正则表达式详解:解析星号的含义
|
7月前
|
Python
使用Python解析网页和正则表达式
使用Python解析网页涉及`requests`和`re`模块。首先导入这两个模块,然后用`requests.get()`发送HTTP请求获取URL内容。通过`.text`属性得到HTML文本。接着,利用正则表达式和`re.search()`匹配特定模式(如网页标题),并用`.group(1)`获取匹配数据。最后,对提取的信息进行处理,如打印标题。实际操作时,需根据需求调整正则表达式。
80 2
|
7月前
|
监控 JavaScript 前端开发
|
6月前
|
数据库 Python
Python网络数据抓取(8):正则表达式
Python网络数据抓取(8):正则表达式
61 2
|
6月前
|
自然语言处理 JavaScript 前端开发
Python高级语法与正则表达式(二)
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。

推荐镜像

更多