简单表达式
正则表达式的最简单形式是在搜索字符串中匹配其本身的单个普通字符。/a/
,/7/
,/M/
;
可以将许多单字符组合起来以形成大的表达式/a7M/
。
请注意,没有串联运算符。只须在一个字符后面键入另一个字符。
字符匹配
句点 (.)
匹配字符串中的各种打印或非打印字符,只有一个字符例外。这个例外就是换行符 (\n)
。
- 正则表达式
/a.c/
匹配 aac、abc、acc、adc 等等,以及 a1c、a2c、a-c 和 a#c: - 通过转移字符使用句点
(.)
,正则表达式/filename\.ext/
匹配 filename.ext。
中括号表达式
中括号表达式的典型用途是指定任何大写或小写字母或任何数字的匹配。下面的表达式指定这样的匹配:
```
/[A-Za-z0-9]/
```
若要查找不在列表或范围内的所有字符,请将插入符号 (^) 放在列表的开头。
/Chapter [^1-5]/
/Chapter [^12345]/
若要创建匹配字符组的一个列表,请在方括号([ 和 ])内放置一个或更多单个字符。当字符括在中括号内时,该列表称为"中括号表达式"。与在任何别的位置一样,普通字符在中括号内表示其本身,即,它在输入文本中匹配一次其本身。
大多数特殊字符在中括号表达式内出现时失去它们的意义。不过也有一些例外,如:
- 如果
]
字符不是第一项,它结束一个列表。若要匹配列表中的]
字符,请将它放在第一位,紧跟在开始[
后面。 \
字符继续作为转义符。若要匹配\
字符,请使用\\
。
在中括号中使用连字符
若要使用范围代替字符本身来表示匹配字符组,请使用连字符 (-) 将范围中的开始字符和结束字符分开。/Chapter [1-5]/
与/Chapter [12345]/
相同,前者使用连字符-
,这里需要注意,单词 Chapter 和后面的空格的位置相对于中括号内的字符是固定的。中括号表达式指定的只是匹配紧跟在单词 Chapter 和空格后面的单个字符位置的字符集。这是第九个字符位置。
当以这种方式指定范围时,开始值和结束值两者都包括在范围内。注意,还有一点很重要,按 Unicode 排序顺序,开始值必须在结束值的前面。
若要在中括号表达式中包括连字符,请采用下列方法之一:
-
用反斜杠将它转义:
[\-]
-
将连字符放在中括号列表的开始或结尾。下面的表达式匹配所有小写字母和连字符:
[-a-z] [a-z-]
-
创建一个范围,在该范围中,开始字符值小于连字符,而结束字符值等于或大于连字符。下面的两个正则表达式都满足这一要求:
[!--] [!-~]
替换和分组
替换使用 |
字符来允许在两个或多个替换选项之间进行选择。
这里有两个对比示例:
-
/^(Chapter|Section) [1-9][0-9]{0,1}$/
上面的正则表达式要么匹配行首的单词 Chapter,要么匹配行尾的单词 Section 及跟在其后的任何数字。如果输入字符串是 Chapter 22,那么上面的表达式只匹配单词 Chapter。如果输入字符串是 Section 22,那么该表达式匹配 Section 22。
-
/^(Chapter|Section) [1-9][0-9]{0,1}$/
使用括号来限制替换的范围,使正则表达式更易于控制,这里涉及到反向引用。通过在上面的正则表达式的适当位置添加括号,就可以使该正则表达式匹配 Chapter 1 或 Section 3。
注:在这里的1和2 两项中,尽管这些表达式正常工作,但 Chapter|Section
周围的括号还将捕获两个匹配字中的任一个存储供以后使用。由于在上面的表达式中只有一组括号,因此,只有一个被捕获的"子匹配项"。
- 只需要使用括号来组合单词 Chapter 和 Section 之间的选择。若要防止匹配被保存以备将来使用,请在括号内正则表达式模式之前放置 ?:。
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/
上面的修改可以提供相同的能力而不保存子匹配项。
- 除 ?: 元字符外,两个其他非捕获元字符创建被称为"预测先行"匹配的某些内容。
正向预测先行使用?=
指定,它匹配处于括号中匹配正则表达式模式的起始点的搜索字符串。/Windows(?=95 |98 |NT )/
找到一处匹配后,紧接着就在匹配的文本(不包括预测先行中的字符)之后搜索下一处匹配。例如,如果上面的表达式匹配 Windows 98,将在 Windows 之后而不是在 98 之后继续搜索。
反向预测先行使用 ?!
指定,它匹配处于与正则表达式模式不匹配的字符串的起始点的搜索字符串。不匹配规定的前面的字符串。
这里建议到正则表达式中的元字符中去查看详细讲解。
其他示例
正则表达式 | 描述 |
---|---|
/\b([a-z]+) \1\b/gi | 一个单词连续出现的位置。 |
/(\w+): \/\/([^/:]+)(:\d*)?([^# ]*)/ | 将一个URL解析为协议、域、端口及相对路径。 |
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/ | 定位章节的位置。 |
/[-a-z]/ | a至z共26个字母再加一个-号。 |
/ter\b/ | 可匹配chapter,而不能匹配terminal。 |
/\Bapt/ | 可匹配chapter,而不能匹配aptitude。 |
/Windows(?=95 |98 |NT )/ | 可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后,从Windows后面开始进行下一次的检索匹配。 |
/^\s*$/ | 匹配空行。 |
/\d{2}-\d{5}/ | 验证由两位数字、一个连字符再加 5 位数字组成的 ID 号。 |
/<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*/\1\s*>/ | 匹配 HTML 标记。 |