首页 > 解决方案 > 我想在我的参数编辑器中使用正则表达式来验证标志和值

问题描述

这是我的应用程序输入的样子。

-T  -a 10/06/01 -c stats,sag,cor,tra -P 0 --jsonReturn false --splash All anonymized data --prefix -3.0 --l -3

这里 (--) 后面的单词是标志,后面的值是用户输入。我希望正则表达式分别给我值和标志,以便我可以对它们运行验证。错误消息的示例如下:“无效的参数值”和“无效的参数值输入”。

这是我写的一个正则表达式,它将标志和值作为单独的组提供。

/([^\s=]+)(?:(?:=|\s+|[^--])([^ --][\w,]+))?/gm

这是一个比上面更好的正则表达式。

/([^\s=]+)(?:(?:=|\s+|[^--])([^ --]+))?/gm

以下是一些用于测试您的正则表达式的输入值。

-p 1 -n -1 -z zfile.csv --random false -d 

--bucket null --prefix null --awskeyid null --awssecretkey null

标签: javascriptregexvalidationuser-input

解决方案


尝试以下正则表达式:

/(-{1,2}[^\s]+)(\s+".+?"|\s+[^\s-]+)?/g

它允许您使用双引号转义破折号和空格,例如:

-p 1 -n "-1" -z zfile.csv --random false -d
// Or
-T -a 10/06/01 -c stats,sag,cor,tra -P 0 --jsonReturn false --splash "All anonymized data" --prefix "-3.0" --l "-3"

双引号是值的一部分,也是前导空格,但我认为您会轻松处理它们。

编辑

这是一个完整的工作功能,可以使用:

function getOpts(opts) {
  let regex = /(-{1,2}[^\s]+)(\s+".+?"|\s+[^\s-]+)?/g;
  let flags = {};
  let match;

  while(match = regex.exec(txt)) {
    let key = match[1];
    let value = match[2];
    if(value) value = value.replace(/^\s+|"/g,'');

    flags[key] = value;
  }

  return flags;
}

推荐阅读