正则表达式目的(最初是由Linux的sed和grep发展而来)
-
给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”)
-
可以通过正则表达式,从字符串中获取我们想要的特定部分。
目的
-
验证: 表单提交时,进行用户名密码验证。
-
查找: 从大量信息中快速提取指定内容。在一批url中,查找指定url
-
替换: 将指定格式的文本,进行正则匹配查找,找到之后进行特定替换,(vim文本替换等)
下面用grep命令用来验证正则表达式,grep是Linux下一个按行匹配文本的工具
-
-E:使用扩展正则匹配(如果不适用,使用的基本正则匹配,下面会讲)
-
--color:将匹配的内容进行语法高亮
.bashrc中加grep重命名了,如下,所以默认会显示匹配高亮
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
egrep等价于grep -E,它用的扩展正则匹配
基本要素
-
字符类
-
数量限定符
-
位置限定符
-
特殊符号
字符类
字符 | 含义 | 举例 |
. | 匹配任意一个字符 | abc.可以匹配abcd,abce等 |
[] | 匹配括号中的任何一个字符 | [abc]d可以匹配ad,bd,cd三种情况 |
- | 在[]内表示字符的范围 | [0-9a-fA-F]可以匹配一位十六进制数字 |
^ | 位于[]括号内的开头,匹配除括号中的字符之外的任何一个字符,表示非 | [^xy]1可以匹配a1,b1,但不匹配x1,y1 |
[[ :xxx: ]] | grep工具预定义的一些命名字符类,注意只匹配一个 | [[ :alpha: ]]匹配一个字母 [[ :digit: ]]匹配一个数字 |
举例
注:[]中的内容都只匹配一个字符
数量限定符
字符 | 含义 |
? | 它前面的单元匹配零个或一个 |
+ | 它前面的单元匹配一个或多个 |
* | 它前面的单元匹配零个或多个 |
{N} | 它前面的单元精确匹配N次 |
{N , } | 它前面的单元匹配至少N次 |
{ . M} | 它前面的单元匹配至多M次 |
{N , M} | 它前面的单元匹配最少N次,最多M次 |
举例
位置限定符
字符 | 含义 | 举例 |
^(在匹配内容的前面) | 匹配行首的位置 | ^Content匹配位于一行开头的Content |
$(在匹配内容的后面) | 匹配行末的位置 | ;$匹配位于一行结尾的;,^$匹配空行 |
\<(在匹配内容的前面) | 匹配单词开头的位置 | \<th 匹配th开头的单词,比如this |
\>(在匹配内容的后面) | 匹配单词结尾的位置 | p\> 匹配p结尾的单词,比如leap |
\b | 匹配单词开头或结尾的位置 | \bat\b匹配a开头t结尾的单词,比如at |
\B | 匹配非单词开头和结尾的位置 | \Bat\B匹配不是a开头且不是t结尾的单词,比如battery |
举例
说明:其中\b用来限定是目标串中是否有以指定字符串开头的单词,称之为词界,\B称之为非词界
特殊符号
字符 | 含义 | 举例 |
\ | 转义字符,普通字符转义为特殊字符,特殊字符转义为普通字符 | 普通字符<写成\<表示单词开头位置,特殊字符.写成\.以及特殊字符\写成\\就是普通字符 |
() | 将正则表达式的一部分括起来组成一个单元(前面的数量限定符都是以单元为单位的,而不是字符) | ([0-9]{1,3}\.){3}[0-9]{1,3}表示IP地址 |
| | 连接两个子表达式,表示或的关系 | n(o|either)匹配no或neither |
举例
正则表达式的分类
-
基本(Basic)正则表达式(基本正则表达式将?+{}|()这些字符解释成了普通字符)
-
扩展(Extended)正则表达式(上面讲的这一些都是扩展正则表达式)
-
Perl正则表达式(Perl语言的正则表达式,一种更高级更简便的正则表达式)
基本和扩展正则表达式两者的区别就是对一些特殊字符的解释不同( ?+{}|() )。
举例
以下是一些常见\转义的字符集
符号 | 替换规则 | 匹配 |
\d | [0-9] | 匹配数字字符 |
\D | [^0-9] | 匹配非数字字符 |
\w | [a-zA-Z0-9_] | 匹配数字字母和下划线(注意还有下划线) |
\W | [^\w] | 匹配非数字字母和下划线 |
\s | [_\r\t\n\f] | 匹配空白区域 |
\S | [^\s] | 匹配非空白区域 |
我们来试试效果
???没效果?那是因为这个Perl语言才有的转义字符集,加上-P选项就好了
正则表达式的贪婪模式与非贪婪模式
贪婪模式(.*):正则表达式去匹配时,会尽量多的匹配符合条件的内容(grep就是贪婪模式的正则匹配)
非贪婪模式 (.*?):正则表达式去匹配时,会尽量少的匹配符合条件的内容,也就是说,一旦发现匹配符合要求,立马就匹配成功
可以看到,非贪婪模式的标识符,就是贪婪模式的标识符后面加上一个?