使用PCRE2正则表达式解析rsync命令行参数的需求咨询
解析rsync命令行选项的PCRE2正则表达式优化
需求说明
需要适配PCRE2正则,解析rsync的两类命令行选项:
- 短选项:以
-开头,支持多选项合并(如-av) - 长选项:以
--开头,支持=赋值(允许=前后带空格,如--exclude-from = /path)
同时要捕获命令末尾的源文件夹和目标文件夹参数。
优化后的正则表达式
(?:(-(?<short_opt>[a-zA-Z]+))|(--(?<long_opt>[a-zA-Z0-9-]+)(?:\s*=\s*|(?=\s))(?<long_val>(?:"[^"]*"|'[^']*'|[^\s]+))?)|(?<path>[^\s]+(?:\s[^\s]+)*))(?=\s|$)
正则结构拆解
- 短选项匹配:
(-(?<short_opt>[a-zA-Z]+))
匹配-开头的短选项组,将选项名捕获到short_opt命名组(如-av会捕获av)。 - 长选项匹配:
(--(?<long_opt>[a-zA-Z0-9-]+)(?:\s*=\s*|(?=\s))(?<long_val>(?:"[^"]*"|'[^']*'|[^\s]+))?)--(?<long_opt>[a-zA-Z0-9-]+):捕获长选项名到long_opt组(如--out-format)(?:\s*=\s*|(?=\s)):兼容两种值分隔方式——带可选空格的=,或直接空格(无=的无值选项)(?<long_val>(?:"[^"]*"|'[^']*'|[^\s]+))?:捕获长选项值,支持双引号/单引号包裹的含空格内容,或非空格字符;?标记值为可选(如--ignore这类无值选项)
- 路径匹配:
(?<path>[^\s]+(?:\s[^\s]+)*)
捕获未被选项匹配的末尾参数,即rsync的源和目标路径,支持引号包裹的含空格路径。
示例测试
针对命令:
rsync -av -t --out-format="%M %'10'b %f" --ignore-times -i --exclude-from = /home/user1/myapppath/exclude.txt --ignore --link-dest="/home/user1/myback2/abc/2024-09-11T16_55_45" source/abc dest/abc
匹配结果:
- 短选项组:
av、t、i - 长选项组:
out-format→"%"M %'10'b %f"ignore-times→ 无值exclude-from→/home/user1/myapppath/exclude.txtignore→ 无值link-dest→"/home/user1/myback2/abc/2024-09-11T16_55_45"
- 路径组:
source/abc、dest/abc
注意事项
- 需确保PCRE2引擎开启命名捕获组支持
- 短选项仅匹配字母(rsync短选项无数字)
- 引号包裹的内容会完整捕获(包括引号本身,可后续处理去除)
内容的提问来源于stack exchange,提问作者user603749
相关产品推荐
相关产品推荐

