选择(Alternation)是指在正则表达式中使用 | 符号表示 "或" 的逻辑关系。它允许你匹配多个可能的模式之一。
cat|dog
这个模式会匹配 "cat" 或 "dog"。
分支是指正则表达式引擎在匹配过程中遇到选择点时,会尝试不同的匹配路径。当一条路径匹配失败时,引擎会回溯并尝试其他可能的路径。
| 的工作原理| 分隔的各个选项选择通常与分组 () 结合使用,以限定选择的范围:
gr(a|e)y这个模式会匹配 "gray" 或 "grey"。
当正则表达式引擎遇到选择点时:
// 匹配多种日期格式
const datePattern = /\b(January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}, \d{4}\b/;
console.log(datePattern.test("March 15, 2023")); // true
console.log(datePattern.test("Sept 10, 2022")); // false (缩写不匹配)import re
# 匹配美式或英式拼写
pattern = r"colou?r|color"
text = "The color is red and the colour is blue"
matches = re.findall(pattern, text)
print(matches) # 输出: ['color', 'colour']
// 匹配多种电话号码格式
String phonePattern = "(\\(\\d{3}\\) ?|\\d{3}[-.]?)\\d{3}[-.]?\\d{4}";
String[] testNumbers = {
"(123)456-7890",
"123.456.7890",
"123-456-7890",
"1234567890"
};
for (String number : testNumbers) {
System.out.println(number.matches(phonePattern)); // 全部输出 true
}
高频选项前置:将最可能匹配的选项放在前面
(common|uncommon|rare) # 优化顺序避免冗余分支:
(a|ab|c) # 不好
(ab?|c) # 更好使用非捕获组:当不需要捕获分组时
(?:pattern1|pattern2)