下面这个例子可以匹配嵌套的<div>标签:<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>.
还有些什么东西没提到
上边已经描述了构造正则表达式的大量元素,但是还有很多没有提到的东西。下面是一些未提到的元素的列表,包含语法和简单的说明。你可以在网上找到更详细的参考资料来学习它们--当你需要用到它们的时候。如果你安装了MSDN Library,你也可以在里面找到.net下正则表达式详细的文档。
这里的介绍很简略,如果你需要更详细的信息,而又没有在电脑上安装MSDN Library,可以查看关于正则表达式语言元素的MSDN在线文档。
表7.尚未详细讨论的语法
代码/语法 |
说明 |
\a |
报警字符(打印它的效果是电脑嘀一声) |
\b |
通常是单词分界位置,但如果在字符类里使用代表退格 |
\t |
制表符,Tab |
\r |
回车 |
\v |
竖向制表符 |
\f |
换页符 |
\n |
换行符 |
\e |
Escape |
\0nn |
ASCII代码中八进制代码为nn的字符 |
\xnn |
ASCII代码中十六进制代码为nn的字符 |
\unnnn |
Unicode代码中十六进制代码为nnnn的字符 |
\cN |
ASCII控制字符。比如\cC代表Ctrl+C |
\A |
字符串开头(类似^,但不受处理多行选项的影响) |
\Z |
字符串结尾或行尾(不受处理多行选项的影响) |
\z |
字符串结尾(类似$,但不受处理多行选项的影响) |
\G |
当前搜索的开头 |
\p{name} |
Unicode中命名为name的字符类,例如\p{IsGreek} |
(?>exp) |
贪婪子表达式 |
(?<x>-<y>exp) |
平衡组 |
(?im-nsx:exp) |
在子表达式exp中改变处理选项 |
(?im-nsx) |
为表达式后面的部分改变处理选项 |
(?(exp)yes|no) |
把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no |
(?(exp)yes) |
同上,只是使用空表达式作为no |
(?(name)yes|no) |
如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no |
(?(name)yes) |
同上,只是使用空表达式作为no |
好吧,我承认,我骗了你,读到这里你肯定花了不止30分钟.相信我,这是我的错,而不是因为你太笨.我之所以说"30分钟",是为了让你有信心,有耐心继续下去.既然你看到了这里,那证明我的阴谋成功了.被忽悠的感觉很爽吧?
要投诉我,或者觉得我其实可以忽悠得更高明,欢迎来我的微博让我知道. 如果你有关于正则表达式的问题, 可以到 stackoverflow 网站上提问, 记得要添加 regex 标签. 如果你更习惯于用中文交流, 可以到微博上用 #正则# 标签提出问题.
网上的资源及本文参考文献
更新纪录
- 2006-3-27 第一版
- 2006-10-12 第二版
- 修正了几个细节上的错误和不准确的地方
- 增加了对处理中文时的一些说明
- 更改了几个术语的翻译(采用了MSDN的翻译方式)
- 增加了平衡组的介绍
- 放弃了对The Regulator的介绍,改用Regex Tester
- 2007-3-12 V2.1
- 修正了几个小的错误
- 增加了对处理选项(RegexOptions)的介绍
- 2007-5-28 V2.2
- 重新组织了对零宽断言的介绍
- 删除了几个不太合适的示例,添加了几个实用的示例
- 其它一些微小的更改
- 2007-8-3 V2.21
- 修改了几处文字错误
- 修改/添加了对$,\b的精确说明
- 承认了作者是个骗子
- 给RegexTester添加了Singleline选项的相关功能
- 2008-4-13 v2.3
- 调整了部分章节的次序
- 修改了页面布局,删除了专门的参考节
- 针对读者的反馈,调整了部分内容
- 2009-4-11 v2.31
- 修改了几处文字错误
- 添加了一些注释说明
- 调整了一些措词
- 2011-8-17 v2.32