正则表达式是由普通字符(例如字符a ~ z)及特殊字符(称为元字符)组成的匹配模式字符串。
普通字符 非打印字符 特殊字符 次数限定符 贪婪与非贪婪限定符 定位符 选择与分组 向后引用 |
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
普通字符 |
||||||||||||||||||||||||||||||||||||||||||||||||
普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。 |
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
非打印字符 |
||||||||||||||||||||||||||||||||||||||||||||||||
除以上的普通字符外,还有少量的非打印字符,非打印字符使用转义符号 "\"表示。如下表: |
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
特殊字符 |
||||||||||||||||||||||||||||||||||||||||||||||||
一些有特殊含义的字符,通常都是正则表达式语法中规定的匹配字符。如下表: |
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
示例如: |
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
次数限定符 |
||||||||||||||||||||||||||||||||||||||||||||||||
次数限定符即限定匹配某一字符表达式的次数,用来指定正则表达式的一个给定组合必须要出现多少次才能满足匹配。 |
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
贪婪与非贪婪限定符 |
||||||||||||||||||||||||||||||||||||||||||||||||
贪婪限定符会尽可能多的匹配文字,只有在它们的后面加个一个"?"就可以实现非贪婪或最小匹配 |
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
例如,你可能要搜索一个HTML文档来查询一处包含在H1标记中的章节标题。在文档中该文字可能具有如下形式: |
||||||||||||||||||||||||||||||||||||||||||||||||
<H1> Chapter 1 - Introduction to Regular Expressions </H1> |
||||||||||||||||||||||||||||||||||||||||||||||||
下面的表达式匹配从开始的小于号(<)到H1标记结束处的大于号之间的所有内容: |
||||||||||||||||||||||||||||||||||||||||||||||||
<.*> |
||||||||||||||||||||||||||||||||||||||||||||||||
如果所要匹配的就是开始的H1标记,则下述非贪婪地表达式就只能匹配到<H1>: |
||||||||||||||||||||||||||||||||||||||||||||||||
<.*?> |
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
定位符 |
||||||||||||||||||||||||||||||||||||||||||||||||
定位符用来描述匹配到的字符串或单词的边界。定义符可以将一个正则表达式固定在一行的开始和结束,也可以创建只在单词内或只在单词的开始或结尾处出现的正则表达式。 |
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
示例如下: |
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
替换与分组 |
||||||||||||||||||||||||||||||||||||||||||||||||
替换使用 |字符来允许在两个或多个替换选项之间进行选择。例如,可以扩展章节标题正则表达式,以返回比章标题范围更广的匹配项。但是,这并不象您可能认为的那样简单。替换匹配 |字符任一侧最大的表达式。 您可能认为,下面的表达式匹配出现在行首和行尾、后面跟一个或两个数字的 Chapter 或 Section: |
||||||||||||||||||||||||||||||||||||||||||||||||
^Chapter|Section [1-9][0-9]{0,1}$ |
||||||||||||||||||||||||||||||||||||||||||||||||
很遗憾,上面的正则表达式要么匹配行首的单词 Chapter,要么匹配行尾的单词 Section及跟在其后的任何数字。如果输入字符串是 Chapter 22,那么上面的表达式只匹配单词 Chapter。如果输入字符串是 Section 22,那么该表达式匹配 Section 22。通过在上面的正则表达式的适当位置添加括号,就可以使该正则表达式匹配 Chapter 1 或 Section 3: |
||||||||||||||||||||||||||||||||||||||||||||||||
^(Chapter|Section) [1-9][0-9]{0,1}$ |
||||||||||||||||||||||||||||||||||||||||||||||||
使用圆括号同时会有一个副作用,就是相关的匹配会被缓存。为了消除缓存,此时可以将"?:"放在第一个选项前,用来消除这种副作用。其中"?:"是非捕获元之一,还有两非捕获元是 "?=" 和 "?!",这两个还有更多的含义:
可以在正则表达式模式圆括号内部的前面使用"?:"来防止存储该匹配供后续使用。对上面所示正则表达式的下述修改提供了免除子匹配存储的相同功能: |
||||||||||||||||||||||||||||||||||||||||||||||||
^(?:Chapter|Section) [1-9][0-9]{0,1}$ |