大神养成记系列——正则表达式

由于最近实验常常会用到正则表达式,所以我一个不开心,就去学习学习,下面是一些笔记和心得

一 正则表达式的由来

  

 
1)美国新泽西州的Warren McCulloch和出生在美国底特律的Walter Pitts这两位神经生理方面的科学家,研究出了一种用数学方式来描述神经网络的新方法,他们创造性地将神经系统中的神经元描述成了小而简单的自动控制元,从而作出了一项伟大的工作革新。
2)在1956 年,出生在被马克·吐温(Mark Twain)称为“美国最美丽的城市之一”的哈特福德市的一位名叫Stephen Kleene的数学科学家,他在Warren McCulloch和Walter Pitts早期工作的基础之上,发表了一篇题目是《神经网事件的表示法》的论文,利用称之为正则集合的数学符号来描述此模型,引入了正则表达式的概念。正则表达式被作为用来描述其称之为“正则集的代数”的一种表达式,因而采用了“正则表达式”这个术语。
3)之后一段时间,人们发现可以将这一工作成果应用于其他方面。Ken Thompson就把这一成果应用于计算搜索算法的一些早期研究,Ken Thompson是 Unix的主要发明人,也就是大名鼎鼎的Unix之父。Unix之父将此符号系统引入编辑器QED,然后是Unix上的编辑器ed,并最终引入grep。

二 什么是正则表达式,什么时候需要使用它

正则表达式是一种特殊的字符串模式,用来匹配一组字符串。利用给定的组成规则和字符来匹配表达式,用处如下:

1 测试字符串内的模式。
例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。
2 替换文本。
可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。
3 基于模式匹配从字符串中提取子字符串。
可以查找文档内或输入域内特定的文本

三 基础语法

1. 定界符

分隔符可以使任意非字母数字、非反斜线、非空白字符,定界符使用特殊符号,像~~、!!、##等;不要使用\当作定界符;如果分隔符需要在模式内进行匹配,它必须使用反斜线进行转义;如果分隔符经常出现在模式内,最好使用其他分隔符进行替换

2.原子(原子是匹配模式中最基础的组成部分,每个模式至少包含一个原子)


普通原子
可见原子
a-z、A-Z、0-9
不可见原子
\n、\r、\t、\v、\f
特殊字符
$(){[|\.^*+?
通用字符类
\d
任意十进制数字,等价于[0-9]
\D
任意非十进制数字,等价于[^0-9]
\w
任意单词字符,等价于[a-zA-Z0-9_]
\W
任意非单词字符,等价于[^a-zA-Z0-9_]
\s
匹配任意空白字符,等价于[ \f\n\r\t\v]
\S
匹配任意非空白字符,等价于[^ \f\n\r\t\v]
自定义原子表作为原子
#[aeiou]#

3 元字符
*
匹配0次1次或多次其前的原子,等价于{0,}
+
匹配一次或多次其前的原子,等价于{1,}
?
匹配0次或1次其前的原子,等价于{0,1}
.
匹配除了换行符以外的任意一个字符
|
匹配两个或多个分支选择
{n}
表示其前面的原子恰好出现n次
{n,}
表示其前的原子出现不小于n次,即大于等于n次
{n,m}
表示其前的原子至少出现n次,最多出现m次
^或\A
匹配输入字符的开始的位置(或在多行模式下行的开头,即紧随一个换行符之后)
$或\Z
匹配输入字符串的结束位置(活在多行模式下行的结尾,即紧随一个换行符之前)
\b
匹配单词的边界
\B
匹配单词的边界以外的部分
[]
匹配方括号中的任意一个原子
[^]
匹配除了方括号中的原子以外的任意一个字符
()
匹配其整体为一个原子,即模式单元。
选择
用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。
但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。
其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串
反向引用
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储
缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式
每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
可以使用非捕获元字符 '?:'、'?=' 或 '?!' 来重写捕获,忽略对相关匹配的保存
 
4 正则补充
捕获 (exp) 匹配exp,并捕获文本到自动命名的组里 (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,可以写成(?'name'exp) 使用命名捕获分组可以通过\k<name>进行引用 (?:exp) 匹配exp,不捕获匹配的文本,也不给此组分配组号 环视(零宽断言) (?=exp) 匹配exp前面的位置 (?!exp) 匹配后面跟的不是exp的位置 (?<=exp) 匹配exp后面的位置 (?<!exp) 匹配前面不是exp的位置 注释 (?#comment) 注释,不对正则表达式的处理产生任何影响 正则表达式优化 使用字符组代替分支条件 优先选择最左端的匹配结果 标准量词是匹配优先的 谨慎用点号,尽可能不用*和+这样的任意量词 能用字符串函数处理的就尽量使用字符串函数处理 合理使用括号 能确定起始和结束位置尽量使用^和$ 可以对比较大的正则表达式进行拆分匹配
 
正则表达式运算符优先级

正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似相同优先级的从左到右进行运算,不同优先级的运算先高后低。

五 一些常用的正则表达式例子

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 InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

4 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$

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

6 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)

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

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

9 汉字:^[\u4e00-\u9fa5]{0,}$

10 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$

11 长度为3-20的所有字符:^.{3,20}$

12 由26个英文字母组成的字符串:^[A-Za-z]+$

13 数字:^[0-9]*$

14 n位的数字:^\d{n}$

15 零和非零开头的数字:^(0|[1-9][0-9]*)$

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值