首页 > 解决方案 > 从命令行提取选项的正则表达式无法按预期工作

问题描述

我正在尝试分析可能包含密码的命令行,并且当我登录命令行时,我不想记录密码,所以我需要用 **** 替换它。

这是命令行示例:

myprogram --first-option 10 --update-password mypassword --another-option

这是“应该”工作的正则表达式(至少对我来说)但不......

.*?--update-password\s+(?<pwd>.*?)(\s+--\w+)?.*

我的问题是命名组“pwd”不匹配任何内容,因为.*?. 但是,如果我尝试删除? 然后它匹配整行,包括下一个选项。

据我了解应该告诉引擎它必须匹配直到它找到其他东西,这意味着它应该匹配直到它找到另一个选项(\s+--\w+)或什么都没有。但它显然不是那样工作的......我想我过去做过很多次,它总是按我想要的方式工作。不知道我在这里错过了什么。

谢谢你的帮助。

标签: regex

解决方案


您可以使用此正则表达式来完成这项工作:

  • 寻找:(^.*?--update-password\s+)\S+(\s+--.*)
  • 代替:$1*****$2

演示和解释

您的正则表达式不起作用的原因是由于可选的捕获组:(\s+--\w+)?


推荐阅读