正则表达式笔记

elvalad posted @ Jul 14, 2011 09:20:57 PM in Default , 1474 阅读

 

1.入门
1.1什么是正则表达式
1.2正则表达式能干些什么
1.3如何使用
 
2.匹配
2.1纯文本匹配
2.2特殊字符匹配
 
3.高级应用
3.1回溯引用
3.2条件分支
 
4.几个正则表达式实例
 
1.入门
 
1.1什么是正则表达式
简单的说正则表达式是一些用来匹配和处理文本的字符串。它有其特殊的语法和指令,但并不是完备
的程序设计语言。它是处理分本流最强大的工具之一。
 
1.2正则表达式能干些什么
a)在文本文件中匹配特定的字符或字符串
b)生成特定的格式的代码,比如说html中的链接
c)检查某些格式䒈正确性,比如说电子邮件格式
d)在文本文件中需要进行替换
正则表达式的最基本作用就是查找和替换,在平时的使用过程中经常会碰到需要正则表达式来解决这
两个问题,比如使用grep系列的命令匹配字符串,在emacs中使用正则表达式替换等等。
 
1.3如何使用
首先需要明确,不存在正则表达式程序,它只不过是在某些编程语言或开发工具中的具体实现而已,
所以,在使用正则表达式之前,必须保证你的工具或语言拥有解释正则表达式的引擎。同时要注意,
在不同语言,和不同工具中正则表达式的引擎会有所不同。在使用正则表达式时,一个问题通常会
有很多解决方案,没有具体的对错之分。
 
 
2.匹配
 
2.1纯文本匹配
在linux下有很多正则表达式测试工具,比如可以直接使用grep,shell中也内嵌正则表达式,emacs
更是使用正则表达式的最佳战场,也有专门的正则表达式学习工具,比如说kiki等。这里以kiki为例来
学习。
 
文本
hello,i am a boy,i love CS
now,i am learning linux kernel
my homepage is http://elvalad.wordpress.com
 
正则表达式
linux
 
结果
now,i am learning (linux) kernel
 
这是最简单的正则匹配,而正则表达式的功能远非如此。
 
2.2特殊字符匹配
前面的静态纯文本根本无法体现正则表达式的强大,下面一些例子更加实用。
在正则表达式中有些字符具有特殊含义,这些特殊字符我们一般称之为元字符,
下面是一些常用的元字符:
 
------------------------------------------------------
元字符  | 含义   
------------------------------------------------------
[]     |字符集合,至少匹配集合中的一个字符
------------------------------------------------------
[^]    |对字符集合求非
------------------------------------------------------
\      |转义字符
------------------------------------------------------
\b     |回退符(匹配单词边界)
------------------------------------------------------
\B     |不匹配单词边界
------------------------------------------------------
\f     |换页符
------------------------------------------------------
\n     |换行符
------------------------------------------------------
\r     |回车符
------------------------------------------------------
\t     |制表符
------------------------------------------------------
\v     |垂直制表符
------------------------------------------------------
\d     |任意单个数字
------------------------------------------------------
\D     |任意非数字单个字符
------------------------------------------------------
.      |除换行符以外的任意字符
------------------------------------------------------
\w     |等价于[a-zA-Z0-9_]
------------------------------------------------------
\W     |等价于[^a-zA-Z0-9_]
------------------------------------------------------
\s     |等价于[\f\n\r\t\v]
------------------------------------------------------
\S     |等价于[^\f\n\r\t\v]
------------------------------------------------------
\x     |匹配十六进制数
------------------------------------------------------
\0     |匹配八进制数
------------------------------------------------------
+      |匹配一个或多个字符集合
------------------------------------------------------
*      |匹配0个或多个字符集合
------------------------------------------------------
?      |撇配0个或1个字符
------------------------------------------------------
{}     |重复匹配
------------------------------------------------------
\<     |只匹配单词的开头(很多工具不支持)
------------------------------------------------------
\>     |只匹配单词的结尾(很多工具不支持)
------------------------------------------------------
^      |匹配字符串的开始
------------------------------------------------------
$      |匹配字符串的结束
------------------------------------------------------
()     |子表达式
------------------------------------------------------
?=     |向前查找,查找出现在匹配文本之后的内容
------------------------------------------------------
?<=    |向后查找,查找出现在匹配文本之前的内容
------------------------------------------------------
|      |逻辑或操作
------------------------------------------------------
\E     |结束\L或\U转换
------------------------------------------------------
\L     |把后面的字符转换为小写直到遇到\E
------------------------------------------------------
\l     |把下一个字符转换为小写
------------------------------------------------------
\U     |把下一个字符转换为大写直到遇到\E
------------------------------------------------------
\u     |把下一个字符转换为大写
------------------------------------------------------
------------------------------------------------------
3.高级应用
 
3.1回溯引用
回溯引用是指模式的后半部分引用用在前半部分中定义的子表达式。
\1为第一个子表达式,\2为第二个子表达式依次类推。
一个回溯的例子:要求匹配出文本中连续出现的单词
 
文本:
hello hello world
bye bye
small is is beautiful
 
正则表达式:
(\w+)[ ]+\1
 
注意:回溯引用只能用来引用模式中的子表达式,回溯引用一般以\1代表第一个
子表达式,而以\0代表整个正则表达式。
 
3.2条件分支
正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,
具体方法是用|把不同的规则分隔开。
 
例子:
0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种
是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)
 
注意:使用分枝条件时,要注意各个条件的顺序,原因是匹配分枝条件时,将会从左到右地
测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
 
4.几个正则表达式实例
 
URL地址:
 
https?://[-\w.]+(:\d+)?(/([\w/_.]*)?)?
 
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]))
 
电子邮件地址:
 
(\w+\.)*\w+@(\w+\.)+[A-Za-z]+
 
HTML注释:
 
//.*
 
正则表达式的学习需要每天多加练习,包括在平时使用emacs,grep时都是练习的最佳时机。

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter