- 浏览: 30743 次
最新评论
本文内容主要选自 《正则表达式必知必会》, 薄薄的书(100页左右),信息量却很大,非常适合正则表达式入门.
正则表达式测试小软件下载地址: http://www.forta.com/books/0672325667
一、 概述
1. 正则表达式是用来描述文本的模式结构的表达式,是由正则表达式语言写成的由特殊字符、普通字符组合而成的具有特定含义的字符串。
比如 单个数字的正则表达式是 [0-9] 或 \d ; 三位数字的正则表达式是 [0-9][0-9][0-9] 或 \d{3}。由上可见,
2. 一个文本模式可能有多种正则表达式写法,有的简单,有的快速,有的功能全面,有的兼容性好,要多多尝试。
3. 正则表达式是"文本内匹配" , 比如,文本 shuqin1984 , 正则表达式 \d{4} 将在整个文本中匹配 1984 部分。
4. 正则表达式的一个难点是: 要匹配期望的文本比较容易,但要将不期望的东西排除掉比较困难。比如三位数,若写成
\d{3}, 则虽然所有三位数都囊括进去,但不合法的格式文本比如 001, 023 也包含进去了。正确的写法是: [1-9]\d{2}
因此,使用正则表达式之前,对要匹配的文本的模式结构和规则要有清晰明确的归纳,以防漏掉要匹配的文本,
却将不期望的文本匹配进去。
5. 掌握正则表达式语法相对容易,更重要的是灵活应用,多多实践。
二、 匹配单个字符
1. 匹配任意单个字符: . 比如 sa. 可以匹配 sa 后跟任意字符的字符串
2. 匹配指定字符集合中的任意单个字符: 比如 [abc] 将匹配 a 或 b 或 c , ca[ptb] 将匹配 cap, cat 或 cab.
3. 匹配指定字符集合之外的任意单个字符: 比如 [^abc] 将匹配除了 a,b,c 之外的任意单个字符。
ca[^ptb],将匹配 caX 的任意文本,除了 cap, cat, cab
实验:
sales.xls order3.xls sales2.xls sales3.xls apac1.xls europe2.xls sam.xls
saM.XLS na1.xls na2.xls sa1.xls ca1.xls
正则表达式: sa. sa[lm] sa[^lm] [ns]a[1-2] [ns]a[^1-2]
4. 匹配特殊字符: 需要用 \ 进行转义,比如匹配 . 的正则式是 \. , 匹配 \ 的正则式是 \\, 匹配 ( 的正则式是 \(
凡是在正则式中具有特殊含义的字符,要匹配字符本身(将其作为普通文本)都必须进行转义.
通常需要转义的字符有: . + * ? { } [ ] ( ) - \ ^ $
文本同上。 正则表达式 sa.\.xls sa[mlM]\.xls sa[^mlM]\.xls
5. 匹配空白字符: \f 换页 \n 换行 \r 回车 \t 制表符 \v 垂直制表符 空格符
实验文本:
(x+y)^n = C(n,0)x^n + C(n,1)x^(n-1)*y + ... + C(n,k)x^(n-k)*y^k + ... + C(n,n-1)x*y^(n-1) + C(n,n)y^n
正则表达式: C(.,.) C\(.,.\) \+ \s+\+\s+ x\^\(n(-[0-9a-z])?\)
6. 匹配字符区间集合的任意单个字符:
[0-9] 任意数字 [a-z] 任意小写字母 [A-Z] 任意大写字母 [a-f] a,b,c,d,e,f
[a-zA-Z] 任意大小写字母 [^0-9] 任意非数字的字符 [^a-zA-Z] 任意非大小写字母的字符
7. 匹配特殊字符集合中的任意单个字符: 等价于
\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 ]
实验:
正则表达式: [0-9a-fA-F]{6}|[0-9a-fA-F]{3} 匹配 336633 和 FFF
8. POSIX 字符类: 例如:
[:digit:] [0-9] ; [:alpha:] [a-zA-Z] ; [:alnum:] [a-zA-Z0-9]
具体应用要再加一层括号,比如 TEST[[:digit:]] 匹配 TEST0 - TEST9
三、 匹配字符组合
1. XY: 匹配 X 后跟 Y 的文本,比如 [0-9][a-z] 匹配 数字后跟小写字母的文本, 7z, 0x 等, 但不匹配 ap, 77
2. X|Y: 匹配 X 或者 Y ,比如 [0-9]|[a-z] 匹配数字或小写字母,相当于 [0-9a-z]
3. 匹配一个或多个 X : X+ ; 例如 s\d+ 匹配 s后跟至少一个数字, s9, s34, s235, ...
匹配零个或多个 X : X* ; 例如 s\d* 匹配 s后跟空或者至少一个数字, s, s9, s34, s235, ...
匹配零个或一个 X : X?; 例如 https? 匹配 http 或 https
匹配恰好 m 个 X : X{m} ; 例如 s\d{4} 匹配 s0000, s1234, 但不匹配 s234, s23445
匹配至少 m 个 X : X{m,} ; 例如 s\d{2,} 匹配 s12, s123, 但不匹配 s1
匹配至少 m 个 但不超过 n 个X: X{m,n} ; 例如 s\d{2,4} , 匹配 s12, s123, s1234, 但不匹配 s1, s12345
4. 以上 X 可以是一个子表达式: 例如 (s\d){3} 匹配 s1s1s1 ,而不匹配 s111
实验:
s , s1, s12, s123, s1234, s12345, s123456, ... s111, s1s1s1, s2s2, s22, s3333, s3s3s3s3, ...
正则表达式: s\d*, s\d+, s\d? s\d{3}, s\d{2,} s\d{2,4},
(s\d)* , (s\d)+, (s\d)?, (s\d){3}, (s\d){2,}, (s\d){2,4},
5. 惰性匹配: 默认匹配模式是"贪婪型匹配",即匹配尽可能多的文本
实验: You make me lost.
正则式: .* .*? (?).*?(?=)
6. 匹配位置:
[1] \b 单词边界 \B 非单词边界。
文本: The captain wore his cap and cape proudly as he sat listening
to the recap of how his crew saved the men from a capsized vessel.
正则式: cap \bcap cap\b \bcap\b \Bcap cap\B \Bcap\B
[2] ^ 匹配文本起始 $ 匹配文本末尾
例如 ^[a-z]123 将匹配文本 a123 而不是 slh a123 即以小写字母开头后跟123的文本
[a-z]123$ 将匹配文本 sss d123 而不是 sdf123dss 即以小写字母后跟123结尾的文本
实验: a123 a123 sss a123
正则式: ^a123 a123$
7. 子表达式: 使用括号将一个正则表达式作为整体
例如: 三位数.三位数.三位数.三位数 : (\d{1,3}\.){1,3}\d{1,3} ; (\d{1,3}\.) 就是一个子表达式
例如: IP 地址: 0-255.0-255.0-255.0-255 ,这里关键是表达 0-255 中的任意数字
将 0-255 划分为几个区段: 0-9, 10-99, 100-199, 200-249, 250-255
(\b([0-9]|([1-9][0-9])|(1\d{2})|(2[0-4][0-9])|(25[ 0-5]))\.){3}
([0-9]|([1-9][0-9])|(1\d{2})|(2[0-4][0-9])|(25[0-5 ]))
实验: 122.204.142.1 192.168.1.1 127.0.0.1 122.375.86.2
375.122.45.2 122.204.256.1 122.23.21.256
8. 回溯引用: 相同匹配的概念
例如: 匹配 .*? 这里 \1 可以捕获 ([hH][1-6]) 所得到的结果,从而起到对应的效果,以免匹配到
23 的不合法文本。即,若 则 \1 表示 h1, 若 则 \1 表示 H2
文本: HELLO WORLD WA O YEAH
正则式: .*? .*?
引用: ((regex1)-(regex2))-(regex3) \n n 按左括号出现的顺序进行标识
\0 表示匹配的整个文本 \1 ((regex1)-(regex2)) \2 (regex1) \3 (regex2) \4 (regex3)
在替换文本时可以使用 $1, $2, $3, $4 分别引用 \1, \2, \3, \4 捕获的文本。
例如: 正则表达式 ((abc)-(def))-(ghf) 匹配文本 abc-def-ghf
$1 ---> abc-def ; $2 ---> abc ; $3 ---> def ; $4 ---> ghf
9. 前后查找: 位置匹配的概念
比如: 要查找 scatter locate rocate 中 cat 后面是 e 的单词,使用 cat(?=e), 注意,这里并不会捕获e,而是用e作为捕获 cat 的定位信息; 要查找 cat 前面是 s 的单词, 使用 (?正则式: ((https?)|(ftp))(?=:)
10. 嵌入条件: 条件匹配的概念
比如,要匹配 (123)456-7890 或 123-456-7890 ,而不匹配 (123)-456-7890, 123456-7890 , (123-456-7890 等,
这意味着,若123前面是 ( 则后面要匹配 ) 且不跟 - ; 若 123前面不是 ( , 则后面匹配 -
正则表达式是: (\()?\d{3}(?(1)\)|-)\d{3}-\d{4}
(\()? 表示是否存在 ( , 这里用括号将 ( 作为子表达式,以便于后面回溯引用;
(?(1)\)|-) 表示,如果存在 ( ,则匹配 ) ,否则匹配 -
?(back-ref)true-regex 表示,只有当 back-ref 存在时,才会匹配 true-regex;
?(back-ref)true-regex|false-regex 表示,若 back-ref 存在,匹配 true-regex; 若不存在,匹配 false-regex.
文本: (123)456-7890 123-456-7890 (123)-456-7890 123456-7890 (123-456-7890
正则式: \(?\d{3}\)?-?\d{3}-\d{4} (\()?\d{3}(?(1)\)|-)\d{3}-\d{4}
四、小结
以上所述就是构造正则表达式的基本知识。编写正则表达式的一个技巧是分而治之,先划分成若干子表达式分别调试成功,再组合起来。要掌握这样一个强大的文本工具,惟有勤加练习,勤于思考求精耳。
发表评论
-
javascript特殊运算符
2014-01-02 17:45 556in运算符 -
python中if __name__ == '__main__': 的解析
2014-01-02 17:44 373当你打开一个.py文件时,经常会在代码的最下面看到if __ ... -
matlab字符串
2012-07-06 09:51 610Matlab字符串转换及数值格式转换2010-04-07 ... -
正则表达式
2012-07-06 09:44 618正则表达式的英文是regular expression,意 ... -
Flex4的皮肤skin
2012-07-06 09:29 5751.SparkSkin介绍 (1)spark.skin ... -
解决 jQuery 实现父窗口的问题 如window.parent.document.getElementById().innerHTML
2012-07-05 20:44 2467function tipsWindown(title,co ... -
组件编程
2012-07-03 13:42 590面向过程的编程重 ... -
组件编程
2012-07-03 12:13 506面向过程的编程重 ... -
2012-07-03 09:47 1287<br /><br /> ...
-
重写Flex组件
2012-07-02 10:05 475一、为什么要重写组件 1、在FLEX已有组件无法满足业务 ... -
FLEX学习网站
2012-07-02 10:05 542今天把收藏夹共享 ... -
Flex 学习资源
2012-07-02 10:05 664一、国外站点 1.资源网站 Adobe Lab ... -
Flex style - CSS 的使用
2012-07-02 10:05 557Dan Orlando, 软件架 ... -
2012-07-02 09:41 5...
-
Flex是咋回事之三 谁用谁知道
2012-07-01 09:20 542一项技术,从概念 ... -
Flex 导出文件通用处理
2012-07-01 09:20 735本文 ... -
探究 Flex 组件的生命周期
2012-07-01 09:20 493简介: 最为新一 ... -
Adobe Flex UIComponent LifeCycle
2012-07-01 09:20 482Adobe Flex UIComponent L ... -
重写Flex组件
2012-07-01 09:20 456一、为什么要重写组件 1、在FLEX已有组件无法满足业务 ... -
as3 类库(转),留着以后慢慢看
2012-06-30 11:09 892as3 类库(转),留着以后慢慢看 2011年11月03日 ...
相关推荐
正则表达式基础知识!!! 我们先从简单的开始。假设你要搜索一个包含字符“cat”的字符串,搜索用的正则表达式就是“cat”。如果搜索对大小写不敏感,单词“catalog”、“Catherine”、“sophisticated”都可以匹配...
将正则表达式的基础知识浓缩到一张纸上,超实用~
C#正则表达式基础知识(经典归纳简单易懂
javascript正则表达式基础知识入门.docx
正则表达式基础知识,对于初学者不错的指导。
正则表达式基础知识, 1.1 句点符号 1.2 方括号符号 1.3 “或”符号 1.4 表示匹配次数的符号 二、Jakarta-ORO库 。。。。。。。。。。。。。
vba正则表达式基础知识介绍,由浅入深,实例讲解
本文介绍了深入学习正则表达式的基础知识和推荐内容。 本文主要面向对正则表达式知之甚少或没有使用经验,但却熟悉 ASP.NET、可借助 .NET 编程的初学者。此外,希望本文连同 regular expression cheat sheet 成为有...
学习正则表达式,菜鸟必看。如果你想学习正则,请进来看看吧!
注意,本支持库中的所有命令均为高级命令,要求使用者具有一定的正则表达式知识基础。易语言RegEx_static.lib支持库为易语言静态支持库,需要易语言系统5.0版本的支持,需要易语言系统核心支持库5.0版本的支持,提供...
包含js正则表达式基础知识、Jakarta-ORO库和一些HTML应用实例
全书分为三大部分:第一部分主要讲解正则表达式的基础知识,涵盖了常见正则表达式中的各种功能和结构;第二部分主要讲解关于正则表达式的更深入的知识,详细探讨了编码问题、匹配原理、解题思路;第三部分将之前介绍...
注意,本支持库中的所有命令均为高级命令,要求使用者具有一定的正则表达式知识基础。易语言RegEx.fnr,RegEx.fne支持库为一般支持库,需要易语言系统3.8版本的支持,需要易语言系统核心支持库3.7版本的支持,提供了2...
正则表达式基础知识梳理以及归纳,欢迎下载
首先说 正则表达式是什么? 正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式...
C# 正则表达式的用法,包含c#中正则表达式的基本知识和实例运用
正则表达式支持库1.2版 该支持库实现了对正则表达式(Regular Expression)的支持。注意,本支持库中的所有命令均为高级命令,要求使用者具有一定的正则表达式知识基础。 操作系统支持: Windows、Linux、Unix