Regex 在Elm 0.16中删除字符串内部带引号部分的逗号

Regex 在Elm 0.16中删除字符串内部带引号部分的逗号,regex,elm,Regex,Elm,现在,我正在尝试删除引号中包含的任何逗号,并用此字符串中的空格替换它们: (,(,数据,“引用,数据”,123,4.5,),(,数据,(,!@#,(,4.5,),“(,更多”,“数据,),),” 我当前使用的函数使用Javascript样式的正则表达式: removeNeedlessCommmas sExpression = sExpression |> (\_ -> replaceSpacesWithCommas sExpression) |>

现在,我正在尝试删除引号中包含的任何逗号,并用此字符串中的空格替换它们:

(,(,数据,“引用,数据”,123,4.5,),(,数据,(,!@#,(,4.5,),“(,更多”,“数据,),),”

我当前使用的函数使用Javascript样式的正则表达式:

removeNeedlessCommmas sExpression =
    sExpression
      |> (\_ -> replaceSpacesWithCommas sExpression)
      |> Regex.replace Regex.All (Regex.regex ",") (\_ -> ",(?!(?:[^"]*"[^"]*")*[^"]*$)g")
此正则表达式在站点(如)中显示为正常工作

然而,我已经尝试了许多方法来转义正则表达式,以便它在Elm 0.16中工作,但是我文件中的其余代码始终高亮显示,就像文件的其余部分包含在字符串中一样。这是我在当前代码中遇到的错误:

(第1行第64列):意外的“”需要空格、&”或转义码
39│     printToBrowser“((数据“引用数据”123 4.5)(数据(!@#(4.5)\“(更多数据)))
也许能帮你弄明白。
我将发布错误所指的主要函数,以便它更有意义:

main : Html.Html
main =
    printToBrowser "((data \"quoted data\" 123 4.5) (data (!@# (4.5) \"(more\" \"data)\")))"

如蒙协助,将不胜感激。提前谢谢。

我想你需要三样东西:

  • RemovenedLessCommas
    中的最后一个匿名函数中添加一个关闭
    (这可能只是一个复制粘贴错误)
  • 转义正则表达式中的所有内部
    ”,(?!(?:[^\“]*\“[^\”]*\”[^\“]*\”*[^\“]*$)g“
  • 使用正则表达式进行匹配,并替换为如下空格:
    regex.replace regex.All(regex.regex“,(?!(?:[^\“]*\”[^\“]*\”*[^\“]*$)g”)(\\\->”)

  • 如果你认为一个懦弱的解决方案替代死亡反抗超级正则表达式,我可以提供这个:

    removeNeedlessCommas sExpr = 
      replace All (regex "\"[^\"]*?\"")
        (\{match} -> String.map (\c -> if c == ',' then ' ' else c) match)
        sExpr
    
    它允许正则表达式查找带引号的字符串,但在单独的步骤中对这些字符串进行逗号替换。如果愿意,正则表达式也可以这样做

    这是我的测试线束,在以下情况下运行良好:

    输出:

    (,(,data,"quoted,data",123,4.5,),(,data,(,!@#,(,4.5,),"(,more","data,)",),),)
    (,(,data,"quoted data",123,4.5,),(,data,(,!@#,(,4.5,),"( more","data )",),),)
    

    为了更好地衡量,这里有一个完全不使用正则表达式的算法解决方案:

    removeNeedlessCommas str = 
      reverse
      <| snd
      <| foldl (\c (inQ, acc) ->
                  case c of
                    '"' -> (not inQ, cons c acc)
                    ',' -> (inQ, cons (if inQ then ' ' else c) acc)
                    _ -> (inQ, cons c acc))
               (False, "")
               str 
    
    removeNeedlessCommas str=
    颠倒
    (非inQ,cons c acc)
    “,”->(inQ,cons(如果为inQ,则为“其他c”)acc)
    _->(inQ,cons c acc))
    (假,“)
    str
    
    非常感谢您的回复。您对第1点的回答是正确的,但是您发布的正则表达式似乎给出了与以前相同的错误。下面是新的RemoveneedLessCommas函数:
    RemoveneedLessCommas sExpression=sExpression |>(\ \ \ u->replaceSpacesWithCommas sExpression)\>regex.replace regex.All(regex.regex“,”)(\ \->,(?!(?:[^\“]*\”[^\“]*\”*[^\“]*$)g”)
    hmm,正则表达式和
    main
    中的字符串对我来说编译得很好好好,似乎错误消失了,但字符串中的每个逗号都被替换为
    ,(?!(?:[^\“]*\”[^\“]*\“[^\”]*“[^\”]*\”*”[^\”*)g
    。您能告诉我这是由于正则表达式中的错误还是我的程序逻辑中的错误造成的吗?
    removeNeedlessCommas str = 
      reverse
      <| snd
      <| foldl (\c (inQ, acc) ->
                  case c of
                    '"' -> (not inQ, cons c acc)
                    ',' -> (inQ, cons (if inQ then ' ' else c) acc)
                    _ -> (inQ, cons c acc))
               (False, "")
               str