通配符(Wildcard)详解
通配符是一种特殊字符,用于表示一个或多个字符的占位符。它广泛应用于 文件搜索、路径匹配、正则表达式 等场景,帮助简化复杂的匹配规则。
常见通配符及其用途
1. 文件系统通配符
符号名称作用示例*星号匹配 任意数量 的任意字符(包括零个)。*.txt:匹配所有 .txt 文件。
data_*:匹配以 data_ 开头的文件。?问号匹配 单个 任意字符。file?.txt:匹配 file1.txt、file2.txt 等。[]方括号匹配方括号内指定的 任意一个字符。[abc].txt:匹配 a.txt、b.txt 或 c.txt。
[0-9].txt:匹配 0.txt 到 9.txt。{}花括号匹配花括号内的 任意一个选项(多个选项用逗号分隔)。{jpg,png,gif}:匹配 .jpg、.png 或 .gif 文件。
示例(命令行):
bash
# 查找所有 .java 文件
ls *.java
# 查找以 user 开头、后跟单个字符的文件
ls user?.txt
# 查找文件名包含数字 1 到 5 的文件
ls *[1-5]*.pdf
2. 正则表达式通配符
正则表达式中的通配符更强大,支持复杂的模式匹配:
符号作用示例.匹配 任意单个字符(除换行符外)。a.c:匹配 abc、a1c、a c 等。.*匹配 任意数量的任意字符(贪婪模式)。a.*c:匹配 abc、a123c、a c 等。+匹配 前面的元素一次或多次。a+:匹配 a、aa、aaa 等。?匹配 前面的元素零次或一次(非贪婪模式)。colou?r:匹配 color 或 colour。^匹配 字符串的开始位置。^abc:匹配以 abc 开头的字符串。$匹配 字符串的结束位置。abc$:匹配以 abc 结尾的字符串。\d匹配 数字字符(等价于 [0-9])。\d{3}:匹配 3 位数字(如 123)。\w匹配 单词字符(字母、数字、下划线)。\w+:匹配一个或多个单词字符(如 user_name)。
示例(Java):
java
import java.util.regex.Pattern;
// 验证邮箱格式
String email = "user@example.com";
boolean isValid = Pattern.matches("^\\w+@\\w+\\.\\w+$", email);
3. 网络路径通配符
在 URL 或文件路径中,通配符用于匹配特定模式:
符号作用示例*匹配 任意数量的任意字符(单个路径段)。/api/*:匹配 /api/users、/api/products 等。**匹配 任意数量的任意字符(包括路径分隔符)。/static/**:匹配 /static/js/main.js、/static/css/style.css 等。{variable}捕获 路径变量。/user/{id}:匹配 /user/123,id 为 123。
示例(Spring MVC):
java
@GetMapping("/api/products/{id}")
public Product getProduct(@PathVariable Long id) {
// 处理请求,id 为路径中的变量
}
不同场景下的通配符应用
1. 文件搜索(Windows/Linux)
bash
# Windows
dir *.docx # 查找所有 Word 文件
dir C:\data\* # 查找 C:\data 目录下的所有文件
# Linux/macOS
ls *.jpg # 查找所有 JPG 图片
find /home/user -name "*.txt" # 递归查找所有 .txt 文件
2. 网络路由(Spring MVC)
java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 匹配不含 "." 的路径(避免拦截静态资源)
registry.addViewController("/{path:[^\\.]*}")
.setViewName("forward:/index.html");
}
}
3. 数据验证(正则表达式)
python
运行
import re
# 验证手机号码
pattern = r"^1[3-9]\d{9}$"
is_valid = re.match(pattern, "13800138000")
注意事项
通配符与正则表达式的区别:
文件系统通配符(如 *、?)功能简单,仅用于基本匹配。正则表达式(如 .*、\d)功能强大,支持复杂模式匹配。
贪婪与非贪婪匹配:
.* 是贪婪的,会匹配尽可能多的字符。.*? 是非贪婪的,会匹配尽可能少的字符。
转义字符:
在正则表达式中,特殊字符(如 .、*)需要用 \ 转义。例如:
python
运行
# 匹配 .com 域名
pattern = r"\.com$"
总结
通配符是一种高效的匹配工具,根据场景选择合适的通配符:
文件搜索:使用 *、?、[]。正则表达式:使用 .、*、+、^、$ 等。网络路径:使用 *、**、{}。