正如我们之前提到的,保持表达精确总是好的。这不仅适用于编程、交流,也适用于正则表达式。举个例子,你不会给别人写一份杂货清单叫他去买 “Buy more .*”,因为你根本不知道他会买回来什么。相反你会写 “Buy more milk” 或 “Buy more bread”。而在正则表达式中,我们实际上可以明确地定义这种条件判断。
具体来说,在使用分组时,你可以使用 |(逻辑“或”,也叫“管道符”) 来表示多个可能的字符序列。比如在上面的例子中,我们可以写出正则模式 "Buy more (milk|bread|juice)",它只会匹配以下字符串:Buy more milk、Buy more bread 或 Buy more juice。
就像普通分组一样,你可以在条件中使用任意的字符序列或元字符。例如,([cb]ats*|[dh]ogs?) 可以匹配 cats 或 bats,也可以匹配 dogs 或 hogs。 不过要注意,当模式中的条件太多时会变得难以阅读,因此当正则变复杂时,可以考虑将它们拆分成多个更清晰的模式。
现在请尝试编写一个带有条件的正则表达式,用于匹配下面文本中那些小而毛茸茸的小动物的行。
| Task | Text | |
| 匹配 | I love cats | ![]() |
| 匹配 | I love dogs | ![]() |
| 跳过 | I love logs | ![]() |
| 跳过 | I love cogs | ![]() |
| 提示 | 通过使用逻辑或(|),我们可以使用正则表达式 I love (cats|dogs) 来匹配前两行。但 logs 和 cogs 其实也挺酷的。 |