广州网站建设50强名单,苏州网站开发培训班,南县网页定制,网站的静态资源服务器怎么做正则表达式#xff08;9#xff09;#xff1a;扩展正则表达式 小结 本博文转载自
前文中一直在说#xff0c;在Linux中#xff0c;正则表达式可以分为”基本正则表达式”和”扩展正则表达式”。
我们已经认识了”基本正则表达式”#xff0c;现在#xff0c;我们来认… 正则表达式9扩展正则表达式 小结 本博文转载自
前文中一直在说在Linux中正则表达式可以分为”基本正则表达式”和”扩展正则表达式”。
我们已经认识了”基本正则表达式”现在我们来认识一下”扩展正则表达式”。
有了之前的基础学习”扩展正则表达式”简直不要太轻松。
之前说过有些符号是通用的不管是在”基本正则表达式”中还是在”扩展正则表达式”中这些通用的符号所表达的意思都是相同的。
那么我们先来看看哪些符号是通用的看完之后你会信心大增如下字符都是通用的
. 表示任意单个字符。
* 表示前面的字符连续出现任意次包括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正好相反。上述符号在基本正则表达式中与扩展正则表达式中的用法完全相同。
有没有感觉70%都是通用的那么我们来动手试试。
在总结grep命令时我们提到过grep命令默认只支持基本正则表达式如果想要让grep命令能够支持扩展的正则表达式则需要使用”-E”选项示例如下 上图中grep命令使用了”-E”选项表示grep命令会把”正则表达式”中的符号当成”扩展正则表达式”去理解而不再使用默认的”基本正则表达式”。
但是由于”[A-Z]”是通用的所以不管是否使用扩展正则表达式”[A-Z]”都表示单个大写字母。
刚才说过70%的符号都是通用的那么剩下的30%呢
其实剩下的30%也都差不多与基本正则表达式相比反而更加简单了不信我们就来看看。
在基本正则表达式中{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次才会被匹配到。
看了上述总结以后是不是已经想要放弃使用”基本正则表达式”了呢因为与之相比扩展正则表达式才更符合我们这些懒人的习惯而且扩展正则表达式的可读性也更高毕竟很多符号少了前面的”\”可读性就变强了。
扩展正则表达式中还有一个常用的符号它就是”|” (在基本正则表达式中使用 “\|”, 前面没有讲, 这里补上)
注按住键盘的 “shift键” 和 “\”键 就可以打出”|”
“|”在扩展正则表达式中表示”或”这样说不容易理解我们来看个小例子就能明白示例文件内容如下。 如果我们想要从上例文本中找到以”com”结尾的行我们该怎么办呢我们可以使用如下命令。 同理如果我们想要从示例文本中找出以”net”结尾的行可以使用如下命令。 那么如果我们想要从示例文本找出以”com”结尾或者以”net”结尾的行我们该怎么办呢
这时候我们就需要用到”|”
“|”在扩展正则表达式中表示”或者”所以我们可以使用如下表达式 上图中的扩展正则使用了分组符号”( )””(com|net)”表示将括号内的内容看做一个整体而括号内的内容为”com|net”它表示”com或者net”所以”(com|net)$”就表示以com或者net结尾的行。是不是很简单
那么我们就趁热打铁通过实际练习来熟悉一下”扩展正则表达式”吧。
仍然以刚才的示例文件作为测试文件假设我们想要查找出测试文本中的”合法邮箱”我们应该怎么做呢
既然是要找出”合法邮箱”那么我们则必须事先定义满足哪些条件的邮箱才属于合法邮箱。
所以我们规定如果一个邮箱属于合法邮箱那么必须满足如下条件。
1、邮箱字符串中必须包含””符。
2、””符前面的字符只能是小写字母或数字不能包含特殊符号。
3、””符前面的字符数量至少需要4个至多为16个。
4、邮箱必须以”com”、”net”、”org”、”edu”等顶级域名结尾此处为了方便演示不判断更多的域名。
5、顶级域名之前必须包含一个”点”换句话说就是邮箱必须以”.com”、”.net”、”.org”、”.edu”结尾。
6、””与”.”之间的字符数量不能超过12个不能低于2个。
7、””与”.”之间的字符只能是小写字母或数字不能包含特殊符号。
好了了解了合法邮箱的规则以后我们就可以开始编写正则表达式了我们可以使用如下正则查找文本中的合法邮箱。 如果你觉得上述正则稍微有些复杂不容易理解那么可以将其拆分成几个部分去理解拆分后的每一部分可以与之前的”合法邮箱条件”一一对应如下图所示。 这样看是不是容易理解多了好了赶快自己动手实验一下吧。
小结
我认为有了之前基础的你搞定”扩展正则表达式”肯定是分分钟的事情所以我们就对”扩展正则表达式”进行一下总结吧。
常用符号
. 表示任意单个字符。
* 表示前面的字符连续出现任意次包括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:]]等效次数匹配相关
? 表示匹配其前面的字符0或1次表示匹配其前面的字符至少1次或者连续多次连续次数上不封顶。
{n} 表示前面的字符连续出现n次将会被匹配到。
{x,y} 表示之前的字符至少连续出现x次最多连续出现y次都能被匹配到换句话说只
要之前的字符连续出现的次数在x与y之间即可被匹配到。
{,n} 表示之前的字符连续出现至多n次最少0次都会陪匹配到。
{n,}表示之前的字符连续出现至少n次才会被匹配到。位置边界匹配相关
^表示锚定行首此字符后面的任意内容必须出现在行首才能匹配。
$表示锚定行尾此字符前面的任意内容必须出现在行尾才能匹配。
^$表示匹配空行这里所描述的空行表示回车而空格或tab等都不能算作此处所描述的空行。
^abc$表示abc独占一行时会被匹配到。
\或者\b 匹配单词边界表示锚定词首其后面的字符必须作为单词首部出现。
\或者\b 匹配单词边界表示锚定词尾其前面的字符必须作为单词尾部出现。
\B匹配非单词边界与\b正好相反。分组与后向引用
( ) 表示分组我们可以将其中的内容当做一个整体分组可以嵌套。
(ab) 表示将ab当做一个整体去处理。
\1 表示引用整个表达式中第1个分组中的正则匹配到的结果。
\2 表示引用整个表达式中第2个分组中的正则匹配到的结果。那么什么时候使用基本正则表达式、什么时候使用扩展正则表达式呢 这是一个仁者见仁的话题, 个人认为: 当出现2处或者2处以上使用“\”(反斜杆转义)的正则, 则使用扩展正则。
基本正则表达式与扩展正则表达式的区别: 区别主要是有几个部分可以不使用反斜杆转义. 如下:
1. 分组;
基本正则表达式: \(\)
扩展正则表达式: ()2. 或
基本正则表达式: \|
扩展正则表达式: |3. 次数匹配相关
基本正则表达式:
\? 表示匹配其前面的字符0或1次
\ 表示匹配其前面的字符至少1次或者连续多次连续次数上不封顶。
\{n\} 表示前面的字符连续出现n次将会被匹配到。
\{x,y\} 表示之前的字符至少连续出现x次最多连续出现y次都能被匹配到换句话说只要之前的字符连续出现的次数在x与y之间
即可被匹配到。
\{,n\} 表示之前的字符连续出现至多n次最少0次都会陪匹配到。
\{n,\}表示之前的字符连续出现至少n次才会被匹配到。扩展正则表达式:
? 表示匹配其前面的字符0或1次表示匹配其前面的字符至少1次或者连续多次连续次数上不封顶。
{n} 表示前面的字符连续出现n次将会被匹配到。
{x,y} 表示之前的字符至少连续出现x次最多连续出现y次都能被匹配到换句话说只
要之前的字符连续出现的次数在x与y之间即可被匹配到。
{,n} 表示之前的字符连续出现至多n次最少0次都会陪匹配到。
{n,}表示之前的字符连续出现至少n次才会被匹配到。
关于”扩展正则表达式”就总结到这里希望能够帮助到你~~