从Elm 0.16

时间:2016-02-07 17:16:09

标签: regex elm

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

((,数据,"引用,数据",123,4.5,),(,数据,(,@#,(,4.5),"!(更&# 34;,"数据,)",),),)

我目前正在使用这个使用Javascript样式正则表达式的函数:

removeNeedlessCommmas sExpression =
    sExpression
      |> (\_ -> replaceSpacesWithCommas sExpression)
      |> Regex.replace Regex.All (Regex.regex ",") (\_ -> ",(?!(?:[^"]*"[^"]*")*[^"]*$)g")

此正则表达式在regex101.com等网站中显示为正常工作。

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

(line 1, column 64): unexpected "_" expecting space, "&" or escape code

39│     printToBrowser "((data \"quoted data\" 123 4.5) (data (!@#(4.5) \"(more\" \"data)\")))"

Maybe <http://elm-lang.org/docs/syntax> can help you figure it out.

我将发布错误所指的主要功能,以便更有意义:

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

非常感谢任何帮助。提前谢谢。

2 个答案:

答案 0 :(得分:2)

我认为你需要3件事:

  1. )中的最后一个匿名函数添加结束removeNeedlessCommmas(这可能只是一个复制粘贴错误)
  2. 逃离正则表达式中的所有内部",如下所示:",(?!(?:[^\"]*\"[^\"]*\")*[^\"]*$)g"
  3. 使用正则表达式进行匹配,并使用如下空格替换:Regex.replace Regex.All (Regex.regex ",(?!(?:[^\"]*\"[^\"]*\")*[^\"]*$)g") (\_ -> " ")

答案 1 :(得分:1)

如果你考虑使用一种懦弱的解决方法替代死亡的超级正则表达式,我可以提供:

removeNeedlessCommas sExpr = 
  replace All (regex "\"[^\"]*?\"")
    (\{match} -> String.map (\c -> if c == ',' then ' ' else c) match)
    sExpr

它允许正则表达式查找引用的字符串,但在单独的步骤中将逗号替换为这些字符串。如果愿意,也可以通过正则表达式来完成。

这是我的测试工具,在http://elm-lang.org/try中运行良好:

import Html exposing (..)
import Regex exposing (..)
import String

str = """(,(,data,"quoted,data",123,4.5,),(,data,(,!@#,(,4.5,),"(,more","data,)",),),)"""
main = div [] 
  [ (text str)
  , br [] []
  , (text (removeNeedlessCommas str))]

输出:

(,(,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