re--读书笔记【转】
原文链接
* 正则表达式入门
1.正则表达式的两种基本用途:搜索和替换。
2.正则表达式是一些用来匹配和处理文本的字符串。
小结:正则表达式是文本处理方面功能最强大的工具之一,正则表达式语言用来构造正则表达式,正则表达式用来完成搜索和替换操作。
* 匹配单个字符
1.匹配纯文本:
文本:Hello , my name is Ben. Please visit my website at http://www.forta.com/ .
正则表达式:Ben
结果:Hello , my name is Ben. Please visit my website at http://www.forta.com/ .
2.匹配任意字符:
“.”元字符可以匹配任何一个单个的字符。
3.匹配特殊字符:
“\”元字符可以对有含义的字符进行转义。
小结:正则表达式经常被简称为模式,它们其实是一些由字符构成的字符串。这些字符可以是普通字符(纯文本)或元字符(特殊含义的字符)。“.”可以匹配任何字符。“\”用来对字符进行转义。
* 匹配一组字符
1.匹配多个字符中的某一个:
“[”和“]”元字符定义一个字符集合。
在使用“[”和“]”定义的字符集合里,这两个字符之间的所有字符都是该集合的组成部分,字符集合的匹配结果是能够与该集合里的任意一个成员相匹配的文本。
2.利用字符集合区间:
正则表达式提供了一个特殊的元字符,字符区间可以用“-”(连字符)来定义。
字符区间:[A-Z]、[a-z]、[A-z]、[A-Za-z0-9]
Ps:区间外为“-”本身,无需转义
3.取非匹配:
“^”元字符表明对一个字符集合进行取非匹配。
取非:[^0-9]:匹配任何不是数字的字符
小结:元字符“[”和“]”用来定义一个字符集合,其含义是必须匹配该集合里的字符之一。定义一个字符集合的具体做法有两种:一是把所有的字符都列举出来;二是利用元字符“-”以字符区间的方式给出。字符集合可以以元字符“^”来求非,这将把给定的字符集强行排除在匹配操作以外,除了该字符集合里的字符,其他字符都可匹配。
* 使用元字符
1.元字符:是在正则表达式里有特殊含义的字符。
元字符分类: ①匹配文字(例如“.”)
②正则表达式语法要求(例如“[”“]”)
2.匹配空白字符:
元字符 |
说明 |
[\b] |
回退(并删除)一个字符 |
\f |
换页符 |
\n |
换行符 |
\r |
回车符 |
\t |
制表符 tab键 |
\v |
垂直制表符 |
3.匹配特定的字符类别:
①匹配数字与非数字(数字元字符)
元字符 |
说明 |
\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] |
④匹配十六进制或八进制数值
元字符 |
说明 |
\x |
十六进制\X0A = ASCII(10)=\n |
\0 |
八进制\011 = ASCII(9)=\t |
4.使用POSIX字符类
元字符 |
说明 |
[:alnum:] |
任何一个字母或数字=[a-zA-Z0-9] |
[:alpha:] |
任何一个字母=[a-zA-Z] |
[:blank:] |
空格或制表符=[\t ] |
[:cntrl:] |
ASCII控制字符 |
[:digit:] |
任何一个数字=[0-9] |
[:graph:] |
同[:print:],但不含空格 |
[:lower:] |
任何一个小写字母=[a-z] |
[:print:] |
任何一个可打印的字符 |
[:punct:] |
既不属于[:alnum:]也不属于[:cntrl:]的任何一个字符 |
[:space:] |
任何一个空白字符=[\f\n\r\t\v ] |
[:upper:] |
任何一个大写字母=[A-Z] |
[:xdigit:] |
任何一个十六进制数字=[a-fA-F0-9] |
* 重复匹配
1.匹配一个或多个字符:
“+”:匹配一个或多个字符或字符集合,不可匹配0个字符。
Ps:一般来说,当在字符集合里使用“.”“+”这样的元字符时,被看做普通字符,无需转义。
2.匹配零个或多个字符:
“*”:匹配字符连续出现零次或多次的情况。
3.匹配零个或一个字符:
“?”:只能匹配一个字符或字符集合的零次或一次重复。
4.匹配的重复次数:
“{”“}”:在其中给出重复次数。
{数字}:确切的数
{小值,大值}:区间
{小值, }:至少重复“小值”次。
5.防止过度匹配:
贪婪性元字符 |
懒惰型元字符 |
* |
*? |
+ |
+? |
{n, } |
{n,}? |
*位置匹配
1.边界限定符:
①单词边界:
元字符 |
说明 |
\b |
匹配一个单词的开始或结尾 |
\B |
不匹配一个单词边界(例“-”) |
\< \> |
匹配单词(支持的引擎少) |
②字符串边界:
元字符 |
说明 |
^ |
定义字符串的开头 |
$ |
定义字符串的结尾 |
③分行匹配模式:“(?m)”为分行匹配模式,把行分隔符当一个字符串分隔符。
* 使用子表达式(作用一:重复匹配)
1.子表达式必须用“(”和“)”括起来。
2.子表达式的嵌套:
文本:Pinging hog.forta.com [12.159.46.200] with 32 bytes of data:
正则表达式:(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
结果:Pinging hog.forta.com [12.159.46.200] with 32 bytes of data:
小结:子表达式的作用是把同一个表达式的各个相关部分组合在一起。用“(”“)”来定义。子表达式的常见用途包括:对重复次数元字符的作用对象作出精确的设定和控制、对“|”操作符的OR条件作出准确的定义。
* 回溯引用:前后一致匹配
1.子表达式的另一用途:定义回溯引用。
2.“\1”是一个回溯引用,回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式。
Ps:“\0”用来表示整个正则表达式。
文本:This is a block of of text,several words here are are repeated ,and and they should not be.
正则表达式:[ ]+(\w+)[ ]+\1
结果:This is a block of of text,several words here are are repeated ,and and they should not be.
3.回溯引用在替换操作中的应用:
替换操作需要用到两个正则表达式:搜索模式和替换模式。
文本:Hello , ben@forta.com is my email address.
正则表达式: (\w+[\w\.]*@[\w\.]+\.\w+)
替换:<A HREF = “mailto:$1”>$1</A>
结果:Hello , <A HREF = “mailto:ben@forta.com”> ben@forta.com</A> is my email address.
4.大小写转换:
元字符 |
说明 |
\E |
结束\L或\U转换 |
\l(小写L) |
把下一个字符转换成小写 |
\L |
把\L到\E之间的字符全部转换成小写 |
\u |
把下一个字符转换成大写 |
\U |
把\U到\E之间的字符全部转换成大写 |
* 前后查找
1.向前查找:指定了一个必须匹配但不在结果中返回的模式。
从语法上来看,一个向前查找模式其实就是一个以“?=”开头的子表达式,需要匹配的文本跟在“=”的后面。
“匹配和返回文本”:消费
“只匹配不返回”:不消费
向前查找(向后查找)匹配本身其实是有返回结果的,只是这个结果的字节长度永远为0而已。因此,前后查找操作有时也称为零宽度匹配操作。
正则表达式: .+(?=:)
2.向后查找:“?<=”元字符。
文本:ABC01:$23.45
HGG42:$5.31
CFMX1:$899.00
XTC99:$69.96
Total items found: 4
正则表达式:(?<=\$)[0-9.]+
结果:ABC01:$23.45
HGG42:$5.31
CFMX1:$899.00
XTC99:$69.96
Total items found: 4
3.对前后查找取非:
元字符 |
说明 |
(?=) |
正向前查找 |
(?!) |
负向前查找 |
(?<=) |
正向后查找 |
(?<!) |
负向后查找 |
文本:I paid $30 for 100 apples, 50 oranges, and 60 pears. I saved $5 on this order .
正则表达式:\b(?<!\$)\d+\b
结果:I paid $30 for 100 apples, 50 oranges, and 60 pears. I saved $5 on this order . (匹配数量)
小结:有了向后查找,可以对最终的匹配结果包含且只包含哪些内容作出更精确的控制。前后查找操作可以利用子表达式来指定文本匹配操作的发生位置,并收到只匹配不消费的效果。
* 嵌入条件
1.正则表达式里的条件用“?”来定义。
2.嵌入条件:①根据一个回溯引用来进行条件处理。
②根据一个前后查找来进行条件处理。
3.回溯引用条件:
?(1):检查第一个回溯引用是否存在。
文本:123-456-7890
(123)456-7890
(123)-456-7890
(123-456-7890
1234567890
123 456 7890
正则表达式:(\()?\d{3}(?(1)\)|-)\d{3}-\d{4}
结果:123-456-7890
(123)456-7890
(123)-456-7890
(123-456-7890
1234567890
123 456 7890
4.前后查找条件: (?(前后查找表达式))
文本:11111
22222
33333-
44444-4444
正则表达式:\d{5}(?(?=-)-\d{4})
结果:11111
22222
33333-
44444-4444
re--读书笔记【转】的更多相关文章
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 读书笔记--SQL必知必会18--视图
读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...
- 《C#本质论》读书笔记(18)多线程处理
.NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...
- C#温故知新:《C#图解教程》读书笔记系列
一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- Web高级征程:《大型网站技术架构》读书笔记系列
一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...
- LOMA280保险原理读书笔记
LOMA是国际金融保险管理学院(Life Office Management Association)的英文简称.国际金融保险管理学院是一个保险和金融服务机构的国际组织,它的创建目的是为了促进信息交流 ...
- 《3D Math Primer for Graphics and Game Development》读书笔记2
<3D Math Primer for Graphics and Game Development>读书笔记2 上一篇得到了"矩阵等价于变换后的基向量"这一结论. 本篇 ...
- 《3D Math Primer for Graphics and Game Development》读书笔记1
<3D Math Primer for Graphics and Game Development>读书笔记1 本文是<3D Math Primer for Graphics and ...
- 《More Effective C#》读书笔记
<More Effective C#>这本书,大概是四年前看完的,但只整理了一部分读书笔记,后面有时间的话,会陆续补充的. More Effective C# :使用泛型 More Eff ...
随机推荐
- html select change事件触发
做小组内使用的一个简单工具,其中要实现的一个小功能是当某个下拉菜单的选择值改变时触发另一表单元素的属性变化.自然的想到使用select表单元素的onchange事件. 下拉菜单部分的代码如下: < ...
- IIS访问网站出错[要求输入用户名密码]的解决方案
症状: 1.HTTP 500 - 内部服务器错误 2.您不具备使用所提供的凭据查看该目录或页的权限 3.基于所提供的凭据,您没有权限查看此目录或网页.HTTP 错误 401.3 - 访问被资源 ACL ...
- swift基础-2
一.基本运算符 let a = 5 var b = 10 b = a if a = b{ swift 中赋值运算符,并不将自身作为一个值进行返回,所以编译不合法,帮开发者避免错误,很人性化的语言 } ...
- PHP超全局变量、魔术变量和魔术方法
PHP超全局变量 $_GET 通过get方式传递的值(通过 URL 参数传递给当前脚本的变量的数组.) $_POST 通过post形式传递的值(当 HTTP POST 请求的 Content-Type ...
- Android笔记--View绘制流程源码分析(一)
Android笔记--View绘制流程源码分析 View绘制之前框架流程分析 View绘制的分析始终是离不开Activity及其内部的Window的.在Activity的源码启动流程中,一并包含 着A ...
- CentOS6.4安装JDK,卸载自带的OpenJDK
1.查看OpenJDK的安装包 $ rpm -qa |grep java java-1.6.0-openjdk-1.6.0.0-1.62.1.11.11.90.el6_4.x86_64 java-1. ...
- 安装新版REDIS
http://redis.io/ # wget http://download.redis.io/redis-stable.tar.gz tar zxvf redis-stable.tar.gz -C ...
- python爬虫之路——正则表达式初识
正则表达式:是一个特殊的符号系列,检查字符串是否与指定模式匹配. python中的re模块拥有全部的正则表达式功能. 判断字符: 类型: 数目:有无: 个数:单值 区间 离散 判 ...
- Spoj REPEATS 后缀自动机+set
REPEATS - Repeats 链接:http://www.spoj.com/problems/REPEATS 题意:求S串中某个子串连续循环次数最多的次数. 想法: 从暴力开始,枚举所有串,求出 ...
- Codeforces Round #319 (Div. 2) C Vasya and Petya's Game (数论)
因为所有整数都能被唯一分解,p1^a1*p2^a2*...*pi^ai,而一次询问的数可以分解为p1^a1k*p2^a2k*...*pi^aik,这次询问会把所有a1>=a1k &&am ...