现在我正在尝试删除引号中包含的任何逗号,并将其替换为此字符串中的空格:
((,数据,"引用,数据",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)\")))"
非常感谢任何帮助。提前谢谢。
答案 0 :(得分:2)
我认为你需要3件事:
)
中的最后一个匿名函数添加结束removeNeedlessCommmas
(这可能只是一个复制粘贴错误)"
,如下所示:",(?!(?:[^\"]*\"[^\"]*\")*[^\"]*$)g"
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