张子阳 TraceFact

Dedicated to Asp.Net, C#, XML, DataBase, Design Pattern and Algorithms ...

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  33 随笔 :: 0 文章 :: 753 评论 :: 38 Trackbacks

正则表达式 教程


由于排版和篇幅关系,本文仅提供PDF版本:
http://www.tracefact.net/document/Regular-Expression-Tutorial.pdf

这里列出本文的目录:

  • 引言
  • 什么是正则表达式?
  • 准备工作
  • 匹配单个字符
    1. 匹配固定单个字符
    2. 匹配任意单个字符
    3. 匹配“”元字符
    4. 匹配字符组
      1. 字符组的基本语法
      2. 在字符组中使用字符区间
      3. 反义字符组
    5. 匹配特殊字符7
      1. 匹配元字符
      2. 匹配空字符
      3. 匹配特定字符类型9
        1. 匹配数字类型
        2. 匹配字母、数字、下划线
        3. 匹配空字符
  • 匹配多个字符
    1. 匹配一个或多个
    2. 匹配零个或多个字符
    3. 匹配零个或一个字符串
    4. 匹配指定数目字符
      1. 匹配固定数目的字符
      2. 匹配区间以内数目的字符
    5. 贪婪匹配和惰性匹配
      1. 贪婪匹配、惰性匹配概述
      2. 贪婪匹配的匹配过程
      3. 惰性匹配的匹配过程
      4. 值得注意的两个匹配模式
  • 匹配边界
    1. 匹配单词边界
    2. 边界及其相对性
      1. 边界的定义
      2. 边界的相对性
    3. 匹配非单词边界
    4. 匹配文本边界
      1. 匹配文本首
      2. 匹配文本末
  • 匹配子模式
    1. 子模式
    2. “或”匹配
    3. 在子模式中使用“或”匹配
    4. 嵌套子模式
  • 后向引用
    1. 理解后向引用
    2. 后向引用的一个常见应用
    3. Net中的后向引用
  • 文本替换
    1. 使用后向引用进行文本替换
      1. 高亮显示文本
      2. 替换电话号码格式
    2. Net 中的文本替换
  • 预查和非获取匹配
    1. 理解非获取匹配
    2. 正向预查
    3. 反向预查
    4. 正向、反向预查组合
    5. 负正向预查、负反向预查
      1. 负正向预查
      2. 负反向预查
  • 总结
posted on 2007-10-24 14:38 张子阳. 阅读(2734) 评论(32)  编辑 收藏 所属分类: Misc

评论

#1楼  2007-10-24 15:10 wxdxy [未注册用户]
谢谢,已经在学习
  回复  引用  查看    

#2楼  2007-10-24 15:13 xuyan      
最近我也在学习这个,不懂得还要向你请教了
  回复  引用  查看    

#3楼  2007-10-24 15:41 1-2-3      
42页,天哪,楼主好像在写书!向楼主致敬。
另外,提几点建议:
1. 正则表达式的不同实现版本(例如在.Net中、在Java中、在Ruby中等等)会有一些差异,如果不小心就可能落入陷阱,希望楼主能作个主流实现版本的比较。
2. 正则表达式除了在编程中使用之外,在一些工具软件/IDE中也非常常用。例如VS、EditPlus、Grep等都支持正则表达式,但是支持的程度和用法又各不相同。建议楼主把工作中常见的任务与这些工具软件联系起来,写个实用解决方案集锦之类的,那就感激不尽啦。
  回复  引用  查看    

#4楼  2007-10-24 16:07 半山旅客      
楼主敬业
  回复  引用  查看    

#5楼  2007-10-24 16:21 雨恨云愁      
最好加些平衡组的内容
  回复  引用  查看    

#6楼  2007-10-24 17:35 林骄      
下了看看
谢谢
  回复  引用  查看    

#7楼 [楼主] 2007-10-24 18:46 张子阳.      
@1-2-3

恩,建议是很好,但是工作量太大,我还有其他一些东西想写,以后有时间再考虑完善这篇文章吧。
  回复  引用  查看    

#8楼 [楼主] 2007-10-24 18:49 张子阳.      
@雨恨云愁

恩,以后有时间再完善吧,这次先这样了,只改正文章中的错误,但是暂不添加新内容,我还有很多其他事需要做。

  回复  引用  查看    

#9楼  2007-10-24 22:13 Cat Chen      
很好的文档,支持!
  回复  引用  查看    

#10楼  2007-10-25 08:36 leoxu      
支持
  回复  引用  查看    

#11楼  2007-10-25 09:19 万岁 [未注册用户]
贴一个关于正则表达式的http://net.pku.edu.cn/~yhf/tao_regexps_zh.html

看了博主的pdf文档,朕很欣慰
  回复  引用  查看    

#12楼  2007-10-25 14:50 lovecherry      
支持,多一点你这样的人中国的软件行业就有希望了
  回复  引用  查看    

#13楼  2007-10-25 18:39 菌哥      
学习!
  回复  引用  查看    

#14楼 [楼主] 2007-10-25 18:57 张子阳.      
谢谢楼上诸位的支持,我会继续努力的 ^^v
  回复  引用  查看    

#15楼  2007-10-25 20:38 SOSOS's BLog      
通俗易懂!!!很不错的pdf
  回复  引用  查看    

#16楼  2007-10-25 20:44 SOSOS's BLog      
但我好像发现了个错误,不知是不是..是看了你这个pdf后觉得的..
在5.3.1 匹配数字类型 中的正则:

Text:
city[0].name="xian";
city[1].name="shanghai";
city[a].name="beijing";

RegEx:
city\.[\d\].name --------我觉得是city\[\d\].name (少个"."才对吧)

ReSult:
city[0].name="xian"; --------------(匹配了)
city[1].name="shanghai";--------------(匹配了)
city[a].name="beijing";

  回复  引用  查看    

#17楼  2007-10-25 23:21 20050crd [未注册用户]
谢谢了
正要这个
  回复  引用  查看    

#18楼  2007-10-25 23:41 骆明亮      
谢谢LZ,正需要这个呢!
  回复  引用  查看    

#19楼 [楼主] 2007-10-26 08:36 张子阳.      
@SOSOS's BLog

5.3.1 中是这么写的:City\[\d\]\.Name
你是不是看错了?
  回复  引用  查看    

#20楼  2007-10-26 13:24 SOSOS's BLog      
晕,原来是我屏幕有点脏,有一个小点".",刚好就在那个位置.... 就看成
city\.[\d\].name

真巧哦...............................哈哈
  回复  引用  查看    

#21楼 [楼主] 2007-10-26 13:30 张子阳.      
@SOSOS's BLog

:)
  回复  引用  查看    

#22楼  2007-10-27 01:32 qnql [未注册用户]
好,不错,继续--qnql.net
  回复  引用  查看    

Text
Is the cost of of gasline going up up? Look up of the TV, your mobile phone
You are the best of the the best.
RegEx
(w+) \1
Result
Is the cost of of gasline going up up? Look up of the TV, your mobile phone
You are the best of the the best.
这段请楼主看看
  回复  引用  查看    

在 .Net 中使用正则表达式进行查找时,给子模式命名的语法是:?<name>,后向引用的语法是:\k<name>。
我们改写前面的范例:
Text
<h1>This is a valid header</h1> <h2>This is not valid.</h3>
RegEx
<h(^<sub>[1-6])>.*?</h\k<sub>>
Result
<h1>This is a valid header</h1> <h2>This is not valid.</h3>
可以看到,我们给子模式([1-6])起了个名字sub,然后在后向引用中使用了它“\k<sub>”,“\k<sub>”就相当于“\1”。
这里也有一个错误.
<h(^<sub>[1-6])>.*?</h\k<sub>>
应当写成<h(?<sub>[1-6])>.*?</h\k<sub>>
  回复  引用  查看    

#25楼 [楼主] 2007-10-27 11:39 张子阳.      
@风风风风

谢谢,可能手误了,我现在就改。

第一个是 \w+ ,误写做了 w+;第二个问题类似

有问题一定提出来啊~~~

  回复  引用  查看    

#26楼  2007-10-29 15:38 dodod [未注册用户]
深入浅出,非常棒! 例子都试过一遍就差不多了。
  回复  引用  查看    

#27楼  2007-12-01 18:34 lpzcoder [未注册用户]
非常不错,以前这东西常学常忘,开发的时候翻翻可以应付觉得学得可以了,过了就想不起了,都是基础没打好,印象不深,感觉这次没这么模糊了.
  回复  引用  查看    

#28楼  2007-12-19 16:49 森林鸟      
写得很好,快看完了,对正则表达式有了一个新的认识
我对你写的 Windows [\w.]+\b 表达式不太明白
为什么还要加个.

  回复  引用  查看    

#29楼  2007-12-19 17:19 森林鸟      
是这样的
Windows [\w.]+\b 能匹配 Windows a
为什么不能匹配Windows .

我对这个表达式有点糊涂
  回复  引用  查看    

#30楼 [楼主] 2007-12-20 08:33 张子阳.      
@森林鸟
问题出在 \b 身上,你看过我的文章,那你一定知道对于“. ”来说,它的边界是普通字符。所以,如果你想匹配 Windows . ,可以采用下面两种做法:

1、去掉表达式的 \b:
Windows [\w.]+

2、给想要匹配的文本后面加一个普通字符,同时规定只能匹配一个字符,比如:
表达式 Windows [\w.]{1} 会匹配 Windows .a

  回复  引用  查看    

看了你的《c#中的委托和事件》一文,受益非浅,所以也想读一下你的其他文章,但是有一些只提供pdf版本的,那个连接我打不开,提示如下:

所访问的地址无效,地址是: /Files/JimmyZhang/Regular-Expression-Tutorial.pdf


能不能把你的pdf文件给我发一份?谢谢,我的邮箱是ljf_126@126.com

  回复  引用  查看    

#32楼 [楼主] 2007-12-21 08:35 张子阳.      
@李jianfeng

谢谢你的回复,我才知道原来文件已经掉链了。

我已给你回信。

  回复  引用  查看    

#33楼  2008-01-03 13:56 yfcomeon      
楼主:
你的贪婪的解释不对吧,
收缩时,应该是去掉最后的字符的吧,不应该去掉开始的字符吧
  回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-12-26 19:56 编辑过
 
所属分类的其他文章:
· 正则表达式 教程
· Web标准中的常见问题