如何使用ES6正则捕获终端flags与参数并消除多余空匹配问题
解决方案
修改后的正则表达式
/(?:^(?<flag>-{1,2}[a-z0-9,_-]+(?:\s*,\s*-{1,2}[a-z0-9_-]+)*)|\G(?!^))\s*(?<arguments>[\[<]\S+)?/gim
原正则的问题说明
-{0,2}允许0个连字符作为开头,导致会匹配到非flag开头的内容,甚至产生空匹配- flag分组的字符集包含空格,且使用
*量词允许0长度匹配,导致捕获结果带多余空格,甚至出现空的flag分组 - 断言位置逻辑错误,没有正确限定flag的边界,导致重复匹配文本片段
匹配效果验证
针对你提供的测试用例,修改后的正则匹配结果如下,无多余空格和无效空匹配:
- 匹配结果1:flag =
-d, --devices,arguments =<command> - 匹配结果2:flag =
-d, --devices,arguments =[ios-type...] - 匹配结果3:flag =
-n --no-run,arguments = 空 - 匹配结果4:flag =
-m, --mobile,arguments = 空 - 匹配结果5:flag =
-a, --all,arguments = 空 - 匹配结果6:flag =
-p, --platforms,arguments = 空 - 匹配结果7:flag =
--os,arguments =<os-type>
更易维护的替代方案
如果不需要严格用单条正则实现,可以分两步处理,兼容性和可调试性更强:
- 按行拆分所有测试用例
- 对每行先提取flag段:用正则
/^(?<flag>-{1,2}[a-z0-9,_-]+(?:\s*[,-]\s*[-a-z0-9]+)*)/i匹配获取flag内容 - 提取当前行剩余的所有参数,按空格拆分过滤空值,得到单个参数列表
内容的提问来源于stack exchange,提问作者Docky-Dockling
相关产品推荐
相关产品推荐

