正则表达式储备

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式储备相关的知识,希望对你有一定的参考价值。

正则表达式用途及概念


  正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。是对字符串(包括普通字


(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符

及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。


通俗的了解就是给定一个正则表达式和另一个字符串,我们可以达到如下的目的:


1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”)


2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。


正则表达式的灵活性、逻辑性和功能性非常强,使用正则表达式可以迅速地用极简单的方式达到字符串的复杂控制。

 

 


正则表达式符号


     正则表达式的核心在于利用事先定义好的特定字符、及其组合简单迅速的来达到我们处理文本的目的。所以


对字符的掌握也是学习正则表达式的核心。我们把被定义了特殊定义的字符称为元字符,元字符也是正则表达式的


核心部分,正式因为对元字符的灵活应用,才使得正则表达式可以用极其简单的方式来的处理文本。对于元字符,


一共有四类:字符匹配、匹配次数、位置锚定和分组。详解如下:


 字符匹配:


 .     匹配任意的单个字符


[]     匹配指定范围内的任意单个字符。比如,“[abc]可以匹配‘plan’中的a”


[^]   匹配指定范围外的任意单个字符。比如,“[abc]可以匹配‘plan’中的pln”


[a-z]或[:lower:]    匹配所有的小写字母字符

 
[A-Z]或[:upper:]   匹配所有的大写字母字符


[0-9]或[:digit:]   匹配数字0到9


[:alpha:]   匹配所有的大小写字母,等同于[a-zA-Z]


[:blank:]   匹配空白字符(空格和制表符)


[:space:]   匹配水平和垂直的空白字符

 
[:punct:]   匹配标点符号


[:print:]   匹配可打印字符


[:graph:] 匹配可打印的非空白字符


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


  *    匹配前面的子表达式任意次。例如zo*能z,也能匹配“zo”或“zoo”。等价于o{0,}


  +  匹配前面的子表达式一次或多次。例如zo+匹配“zo”或“zoo”,但是不能匹配“z”,等价于o{1,}。


  ? 匹配前面的子表达式零次或一次。例如“do(es)?”可以匹配“do”或“does”,等价于(es){0,1}。


 {n}  匹配前面的字符n次,例如o{2}不能匹配“boy”中的o,但是可匹配“food”中的o


 {m,n}  匹配前面的字符至少m次,最多n次。例如,“o{1,3}”将匹配“fooooood”中的前三个o为一组,后三个o为一组。

             “o{0,1}”等价于“o?”。


 {,n}   匹配前面的字符至少n次


 {n,}   匹配前面的字符至多n次

  位置锚定:定位出现的位置


  ^   行首锁定,用于模式的最左侧


  $   行尾锚定,用于模式的最右侧


 ^PATTERN$  用于模式匹配整行


 ^$   空行


 ^[[:space:]]*$   空白行


 <   词首锚定,用于单词模式的左侧


 >   词尾锚定,用于单词模式的右侧


 <PATTERN>  匹配整个单词


    匹配一个单词的边界。也就是指单词和空格间的位置,例如“er”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。


 B   匹配非单词边界。“erB”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。


  分组:


  ()      将一个或多个字符捆绑在一起,当作一个整体进行处理,如:(root)+
       分组括号中的模式匹配到的内容会被引擎记录于内部的变量中,这些变量的命名方式为
       : 1,2,3…


  1   表示从左侧起的第一个左括号以及与之匹配的右括号之间的模式所匹配的字符。


  向后引用:  引用前面的分组括号中的模式所匹配字符,而非模式本身。


  |  例如 a|b :表示a或b C|cat 表示Cat或cat

 

 


 
正则表达式应用


 正则表达式的重要性体现在广泛的应用上,例如:

1 Email地址:^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$

 

2 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?

 

3 国内电话号码(0511-4405222、021-87888822):d{3}-d{8}|d{4}-d{7}

 

4 ×××号(15位、18位数字):^d{15}|d{18}$

 

5 日期格式:^d{4}-d{1,2}-d{1,2}

 

6 空白行的正则表达式: s* (可以用来删除空白行)

 

7 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)

 

8 IP地址:d+.d+.d+.d+ (提取IP地址时有用)

 

9 IP地址:((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))

……

 


结语


     对于正则表达式的学习刚刚入门,正则表达式的应用中的实例每一个都思考了很久,对于初学者而言,


晦涩难懂,一知半解是不可避免的,前期的学习利用正则表达式处理好逻辑关系是很重要的一步,另外


大量的练习和查阅资料都是必要的。

以上是关于正则表达式储备的主要内容,如果未能解决你的问题,请参考以下文章

Vue源码AST抽象语法树 - 指针- 递归 - 栈 - 正则表达式 - 手写实现parse

shell编程之正则表达式详解

python与正则表达式:re模块详解

python与正则表达式:re模块详解

perl学习正则表达式处理文本

干货 | Requests+正则表达式爬取猫眼电影