【问题标题】:Javascript Replace all commas not in double quotes [duplicate]Javascript替换所有不在双引号中的逗号[重复]
【发布时间】:2019-10-24 05:28:36
【问题描述】:

我想用竖线 ('|') 替换以逗号分隔的字符串中的所有逗号,但双引号中的逗号除外。如果可能,我更喜欢使用 JavaScript 的“替换”功能。

我的正则表达式知识充其量是有限的。我可以用管道替换所有逗号,但这并没有给我解析数据所需的结果。我还在这里找到了一个正则表达式,它删除了除引号中的逗号之外的所有逗号,但没有实现管道或其他分隔符。

(?!\B"[^"]*),(?![^"]*"\B)

这是我想要完成的一个示例:

string1 = 1234,Cake,,"Smith,John",,"Status: Acknowledge,Accept",,Red,,

我希望它看起来像:

string1 = 1234|Cake||"Smith,John"||"Status: Ackknowledge,Accept"||Red||

【问题讨论】:

  • 这看起来像 CSV 数据。当您想要文字 " 或换行符时会发生什么?最好使用适当的 CSV 解析器。

标签: javascript regex replace


【解决方案1】:

我们可以用一个简单的表达式来简单地捕获我们想要的逗号,例如:

(".+?")|(,)

Demo

正则表达式电路

jex.im 可视化正则表达式:

【讨论】:

  • 这似乎为每个逗号创建了一个额外的管道
  • (实际上对于每个引用的字符串。在左侧末尾添加,??)
  • 当使用全局替换运行它时,我得到以下结果:1234|Cake||||||||Red||当我期望:1234|蛋糕||“史密斯,约翰”||“状态:确认,接受”||红色||
【解决方案2】:

一种选择是使用替换回调将引号或逗号分别替换为引号本身或管道:

str = `1234,Cake,,"Smith,John",,"Status: Acknowledge,Accept",,Red,,`;

res = str.replace(/(".*?")|,/g, (...m) => m[1] || '|');

console.log(res)

另一个(从长远来看,IMO 更好)是使用专用解析器来处理 CSV 数据。 CSV 实际上比看起来要复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    相关资源
    最近更新 更多