【问题标题】:RegEx disallow a character unless escaped正则表达式不允许字符,除非转义
【发布时间】:2017-03-20 20:28:47
【问题描述】:

下面是我解析逗号分隔键值对的正则表达式:

function extractParams(str) {
    var result = {};
    str.replace(/\s*([^=,]+)\s*=\s*([^,]*)\s*/g, function(_, a, b) { result[a.trim()] = b.trim(); });
    return result;
}

例如结果:

extractParams("arg1 = value1 ,arg2    = value2 ,arg3=uuu")

{"arg1":"value1","arg2":"value2","arg3":"uuu"}.

我想扩展此函数以允许值包括转义逗号、等号和转义字符本身。这样的结果:

extractParams("arg1 = val\,ue1 ,arg2 = valu\=e2, arg3= val\\ue3")

将会

{"arg1":"val,ue1","arg2":"valu=e2","arg3":"val\ue3"}.

我该怎么做?谢谢,摩西。

【问题讨论】:

    标签: javascript regex parsing arguments tokenize


    【解决方案1】:

    我构建了一个模式,它甚至可能不需要转义 \, 逗号来区分它们。

    如果我们可以假设您的 键不包含逗号,与值不同,如下所示:

    ke y=,val,ue!可以
    k,ey=val,ue是KO

    那么下面的模式会很好用:

    ([^,]+)=(.+?)(?:(?=,[^,]+=)|$)
    

    你可以在这里玩:https://regex101.com/r/RX4RsR/2

    【讨论】:

      【解决方案2】:

      你可以用这个:

      function extractParams(str) {
          var result = {};
          str.replace(/\s*((?:\\[,\\=]|[^,\\=]*)+)\s*=\s*((?:\\[,\\=]|[^,\\=]*)+)\s*/g, function(_, a, b) { result[a.trim()] = b.trim(); });
          return result;
      }
      
      console.log(extractParams("arg1 = val\\,ue1 ,arg2 = valu\\=e2, arg3= val\\\\ue3"));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-15
        相关资源
        最近更新 更多