交替是正则表达式中匹配一个选择列表的能力。例如,如果我们想编写一个正则表达式来匹配一个 URL,我们可以如表 10 所示来处理它:
表 10:替代规则
| 英国规则 | 正则模式 |
| 从 www 开始 | www |
| 需要一段时间 | \. |
| 那么任意数量的单词字符 | \w{1,} |
| 另一个时期 | \. |
| 以下顶级域名之一(网,网,组织,edu,信息) | (com|net|org|edu|info) |
随着顶级域名(顶级域名)的激增,上述英语规则受到了限制,但交替的概念得到了说明。alternatives 提供了一个备选方案列表,用括号括起来,并用管道字符|分隔。列表中的选项不必大小相同。
alternative 提供了一个备选选项列表,搜索文本需要包含以下选项之一。In 是最简单的,因为列表只是一个要匹配的单词列表。如果我们想扩展网址模式搜索以包括 FTP 站点和网站,我们可以将模式中的www替换为(www|ftp)。
此外,管道字符之间的项目不仅仅必须是单词;它们可以是搜索的模式。假设我们想要一个正则表达式模式来找到我们指定的帮助台人员,我们知道他可能是约翰、苏或比尔。找到技术人员的一种方法可能是列出他们名字的所有变体:(John|Jon|Sue|Susan|Bill|Will)。虽然这种方法可行,但我们也可以使用模式来提高匹配的可能性。
举个简单的例子,让我们找到约翰、乔恩、苏、苏西、苏西、比尔或威尔。
表 11:替代模式
| 英国规则 | 正则模式 |
|---|---|
| 约翰还是乔恩 | Joh{0,1}n |
| 运筹学 | | |
| 起诉 | Sue |
| 运筹学 | | |
| 苏西还是苏西 | Su[sz]ie |
| 运筹学 | | |
| 威尔还是比尔 | [WB]ill |
正则表达式交替模式变为Joh{0,1}n|Sue|Su[sz]ie|[BW]ill。虽然除了文字字符串之外添加模式的能力非常强大,但它也会引入一些微妙的问题。看看我们在本章开头写的 URL 模式:
www\.\w{1,}\.(net|com|org|edu).
我们本可以不用括号写出来:www\.\w{1,}\.net|com|org|edu。但是,正则表达式引擎对此会有不同的解释。如果没有括号,这将被解释为:
找到一个以 www 开头的字符串,后跟一个句点、任意数量的字母、另一个句点以及单词 net 或单词 com 或单词 org 或单词 edu 。因此,以下将是结果,可能不是我们所期望的。
漫画书
喜剧
通过添加括号,正则表达式www\.\w{1,}\.(net|com|org|edu)返回预期结果,即两个网站。
漫画书
喜剧
|
| 注意:在表达式中使用括号会创建一个组,我们将在后面的章节中详细介绍。当我们想要使用正则表达式将一个更大的字符串分解成组件并操作这些组件时,组就派上了用场。在前几章中,我们一直专注于使用 regex 进行搜索,在这几章中,组并不那么重要。 |
当使用交替的时候,一个警告是确保你的选择可以达成。交替一般从左到右解决。如果一些最左边的模式总是匹配的,那么交替将停止,而不是在列表的后面寻找更好的匹配。例如,如果我们编写了以下模式:
\d*|[A-Fa-F]\*\d*|0X\d*
查找数值或十六进制数可能看起来是一种有效的模式。但是,开头的\d*表示一个数字出现 0 次或更多次。任何字符串都将匹配零个出现的数字,因此该模式将始终解析列表中最左边的项目。
交替允许您在分隔的模式列表中选择一个匹配。交替元字符只是用来分隔模式列表的|(垂直管道)。有时,您需要将交替语法用括号括起来,以确保您的逻辑意图是清楚的。