【问题标题】:JavaScript replace not removing carriage returnJavaScript替换不删除回车
【发布时间】:2015-12-10 23:54:20
【问题描述】:

我有一个从 csv 文件生成的 json 对象:

{"FID":["FID"],"the_geom":["the_geom"],"X":["X"],"Y":["Y"],"ROW":["ROW"],"COL":["COL"],"EMH":["EMH"],"B":["B_SURF","B_SUB1","B_SUB2"],"BP_CA":["BP_CA_SUR","BP_CA_SUB1","BP_CA_SUB2"],"BP_K":["BP_K_SURF","BP_K_SUB1","BP_K_SUB2"],"BP_MG"["BP_MG_SUR","BP_MG_SUB1","BP_MG_SUB2"],"BP_NA":["BP_NA_SUR","BP_NA_SUB1","BP_NA_SUB2"],"CA"["CA_SURF","CA_SUB1","CA_SUB2"],"CAMG":["CAMG_SURF","CAMG_SUB1","CAMG_SUB2"],"CEC"["CEC_SURF","CEC_SUB1","CEC_SUB2"],"CLAY":["CLAY_SURF","CLAY_SUB1","CLAY_SUB2"],"CU"["CU_SURF","CU_SUB1","CU_SUB2"],"DPRR_SUMM":["DPRR_SUMM"],"DRAIN_SUMM"["DRAIN_SUMM"],"FE":["FE_SURF","FE_SUB1","FE_SUB2"],"K"["K_SURF","K_SUB1","K_SUB2"],"KMG":["KMG_SURF","KMG_SUB1","KMG_SUB2"],"MG"["MG_SURF","MG_SUB1","MG_SUB2"],"MN":["MN_SURF","MN_SUB1","MN_SUB2"],"NA":["NA_SURF","NA_SUB1","NA_SUB2"],"OM":["OM_SURF","OM_SUB1","OM_SUB2"],"P"["P_SURF","P_SUB1","P_SUB2"],"PAVL"["PAVL_SURF","PAVL_SUB1","PAVL_SUB2"],"PAW24_SUMM":["PAW24_SUMM"],"PAW30_SUMM"["PAW30_SUMM"],"PAW36_SUMM":["PAW36_SUMM"],"PAW42_SUMM":["PAW42_SUMM"],"PAW48_SUMM":["PAW48_SUMM"],"PH":["PH_SURF","PH_SUB1","PH_SUB2"],"RZFC_SUMM":["RZFC_SUMM"],"RZKUSAT_SU"["RZKUSAT_SU"],"RZPAW_SUMM":["RZPAW_SUMM"],"RZPWP_SUMM"["RZPWP_SUMM"],"RZSAT_SUMM":["RZSAT_SUMM"],"S":["S_SURF","S_SUB1","S_SUB2"],"SAND":["SAND_SURF","SAND_SUB1","SAND_SUB2"],"TEX"["TEX_SURF","TEX_SUB1","TEX_SUB2"],"THICK"["THICK_SURF","THICK_SUB1","THICK_SUB2"],"TIP":["TIP_SURF","TIP_SUB1","TIP_SUB2"],"ZN":["ZN_SURF","ZN_SUB1","ZN_SUB2"],"EMV"["EMV"],"ASP":["ASP"],"DEM":["DEM"],"SLOPE\r":["SLOPE\r"]}

最后,斜坡对象的名称中有一个回车符(它是从 csv 转换中继承的)

我需要从对象中删除回车,因为它会弄乱解析对象的其他一些脚本。

我尝试通过以下方式对其进行测试:

console.log("Without carrage return: " + JSON.stringify(jsonObject).replace(/[\n\r]/g, ''));

但是当我打印它时,它仍然包含回车符。

我可能在这里做了一些愚蠢的事情,我只是太累了,我没有注意到它。

感谢任何帮助,谢谢!

【问题讨论】:

  • 试试replace(/\\r/g, '')
  • 这可能不是真正的回车,而是字符串\r
  • 顺便说一句,上面列出的 JSON 字符串无效。
  • @MinusFour: JSON.stringify() 将控制字符转义为其转义序列表示。如果输入包含字符串 \r,则 JSON 将包含 \\r,而 .replace(/[\\r\\n]/g, '') 不会匹配它。
  • 好吧,我说的并不完全正确。 .replace(/[\\r\\n]/g, '') 会匹配它,因为它匹配每个反斜杠以及字母 r 和 n。但是.replace(/\\r/g, '') 会在字符串中保留一个反斜杠。

标签: javascript json csv


【解决方案1】:

您的正则表达式有点损坏。由于 \ 也是一个特殊字符,因此您也需要区分它。

尝试这样做:

console.log("Without carrage return: " + JSON.stringify(jsonObject).replace(/[\\n\\r]/g, ''));

您的正则表达式与整个 \r 字符匹配,但由于您将所有内容都转换为字符串,因此您最终必须匹配字符 '\' 和 'r'。

【讨论】:

  • 正则表达式是正确的,但解释不正确。您没有转义特殊字符 `\`,因为它是回车所必需的,而是匹配回车字符串表示(而不是回车本身)。请参阅此regex 了解真正的 CR 匹配说明。
【解决方案2】:

在正则表达式中\r\n匹配回车和换行,但JSON.stringify()将回车转换成'\r'

所以你只需要使用\\r 而不是\r

console.log("Without carrage return: " + JSON.stringify(jsonObject).replace(/\\n|\\r/g, ''));

编辑:/[\\n\\r]/g 将匹配字符串中的每个反斜杠和每个字母 r 和 n,而不仅仅是序列 \r。 /\\n|\\r/g 效果更好。

【讨论】:

    【解决方案3】:

    也许 csv 中的 \r 实际上是一个反斜杠和一个 r?

     console.log( JSON.stringify(jsonObject).replace("\\r", "") )
    

    【讨论】:

    • 不敢相信我没有听懂...
    • 它是否只删除第一次出现的\r
    • 实际上这部分不正确,正如@MaxZoom 所问的那样,它确实只删除了第一次出现。
    猜你喜欢
    • 2016-05-13
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    相关资源
    最近更新 更多