正则表达式学习笔记

本文为阅读《正则表达式必知必会》(修订版) Ben Forta著 杨涛等译 总结所得,以备后用,内容来自此书。

正则表达式是一些用来匹配和处理文本的字符串。
正则表达式的两种基本用途:搜索和替换。

匹配单个字符

符号 作用
[\b] 回退Backspace
\f 换页符
\n 换行符
\r 回车符
\t 制表符
\v 垂直制表符
\r\n windows系统文本行结束标识
\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],退格符例外

英文字符.来表示任意字符,特殊字符需要用反斜杠转义(\)

符号 作用
[\b] 回退Backspace
\f 换页符
\n 换行符
\r 回车符
\t 制表符
\v 垂直制表符
\r\n windows系统文本行结束标识
\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],退格符例外

匹配一组字符

利用[]表示字符集合,匹配之间的某一个字符
[]之间也可以放字符区间表示匹配范围内的某一个字符

符号 作用
A-Z 匹配从A到Z的所有大写字母
a-z 匹配从a到z的所有小写字母
A-z 匹配ASCII码从大写A到小写z之间的所有字符,不常用

可以定义多个区间[A-Za-z0-9]
取非匹配[^0-9],表示匹配任何不是数字的字符

重复匹配

匹配重复的字符1个或多个用+号
匹配重复的字符0个或多个用*号
匹配0个或1个字符用?号
指定重复次数{次数}
指定匹配次数的变化区间{2,4}表示最少重复2次,最多重复4次;{3,}表示至少重复3次
元字符分为贪婪型元字符和懒惰型元字符,贪婪型匹配尽可能多的字符,懒惰型匹配尽可能多的字符,懒惰型元字符为贪婪型后加个?,如*为贪婪型字符,对应的懒惰型字符为*?,为了防止过度匹配,可以使用懒惰型元字符。

位置匹配

单词的边界 \b
字符串的 边界 ^和$ 以字符开始和结束
(?m)开头表示分行匹配

子表达式

子表达式必须用()括起来,子表达式允许嵌套,层数没有限制,表达式之间的或条件用 | 来表示

回溯引用

回溯引用允许正则表达式模式引用前面的匹配结果,模式的后半部分引用在前半部分中定义的子表达式,用\1 \2 ...来表示,1,2,3表示子表达式的位置,回溯表达式相当于引用变量。回溯表达式通常用1开始计数,在许多实现里,用0来代表整个正则表达式。

回溯替换操作

替换操作需要用到两个正则表达式:一个用来给出搜索模式,另一个用来给出匹配文本的替换模式。回溯引用可以跨模式使用,在第一个模式里被匹配的子表达式可以用在第二个模式里。

前后查找

操作符 作用
(?=) 正向前查找
(?!) 负向前查找
(?<=) 正向后查找
(?<!) 负向后查找

匹配网页标题

(?<=<[Tt][Ii][Tt][Ll][Ee]>).*(?=<[Tt][Ii][Tt][Ll][Ee]>)

嵌入条件

正则表达式里的条件用?来定义。
?匹配前一个字符或表达式,如果存在的话。
?=和?<=匹配前面或后面的文本,如果存在的话。

MySQL

MySQL对正则表达式的支持体现在允许在WHERE子句中使用如下格式的表达式:

REGEXP "expression"

功能有如下限制:

  1. 只提供搜索支持,不支持使用正则表达式进行替换操作。
  2. 默认搜索不区分字母大小写,需要在REGEXP和模式之间加BINARY关键字。
  3. [[:<:]]来匹配单词开头,用[[:>:]]匹配单词结束
  4. 不支持向前预测
  5. 不支持嵌入条件
  6. 不支持八进制字符搜索
  7. 不支持\a \b \e \f \v
  8. 不支持回溯引用

JAVA

Java中的正则表达式匹配功能主要是通过java.util.regex.Matcher类和以下这些方法实现的。

find(): 在一个字符串里寻找一个给定的模式匹配。
lookingAt(): 用一个给定的模式去尝试匹配一个字符串的开头。
matches(): 用一个给定的模式去尝试匹配一个完整的字符串。
replaceAll(): 进行替换操作,对所有匹配都进行替换。
replaceFirst(): 进行替换操作,只对第一个匹配进行替换。

java.util.regex.Pattern类提供了几个简单易用的包装器方法。

compile(): 把一个正则表达式编译成一个模式。
flags(): 返回某给定模式的匹配标志。
matches(): 在功能上等价于刚才介绍的matches()方法。
pattern(): 把一个模式还原为一个正则表达式。
split(): 把一个字符串拆分为子字符串。

java的正则表达式与Perl基本兼容,有几点需要注意。

  1. 不支持嵌入条件
  2. 不支持使用\E \l \L \u \U 进行字母大小写转换。
  3. 不支持使用[\b]匹配退格符。
  4. 不支持\z。

常见问题的正则表达式解决方案

IP地址

(((\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])) 

URL地址

(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]

电子邮件地址

(\w+\.)*\w+@(\w+\.)+[A-Za-z]+

HTML注释

<!-{2,}.*?-{2,}>

JavaScript注释

//.*
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容