【问题标题】:Split by comma while ignoring special characters用逗号分割,忽略特殊字符
【发布时间】:2017-01-17 14:16:02
【问题描述】:

我想用逗号分割它,而不是转义的字符串。还要从中删除斜线。

var str = "02-Dentist,\"***IN-Den-WV,VA,SC,TN,LA-122016\",Riverside,888-885-6112,5,1,20.00%,1690000"

电流输出

["02-Dentist,\"***IN-Den-WV,VA,SC,TN,LA-122016\",Riverside,888-885-6112,5,1,20.00%,1690000"

预期输出

["02-Dentist","***IN-Den-WV,VA,SC,TN,LA-122016","Riverside","888-888-9999","5","1","20.00%","1690000"]

尝试过的代码

var replaced = str.replace(/[^\\],/,"$09").split("$09")

【问题讨论】:

  • 您的字符串str 没有反斜杠,并且正则表达式匹配,,该, 前面带有除\ 以外的任何字符(也已使用)。
  • 好的,你能给它一个解决方案吗?我不知道正则表达式
  • 对不起,我觉得这个问题不是很清楚。试试var chunks= str.match(/"[^"\\]*(?:\\.[^"\\]*)*"|[^,]+/g);
  • 两次双引号["02-Dentist", ""***IN-Den-WV,VA,SC,TN,LA-122016"", "Riverside", "888-885-6112", "5", "1", "20.00%", "1690000"]
  • 请参阅jsfiddle.net/86qjjry7 了解替代方案。

标签: javascript regex


【解决方案1】:

您似乎需要将字符串标记为双引号之间或逗号之间的内容。我假设字段用逗号分隔,并且可能用双引号括起来,其中包含转义的引号/实体。

你可以使用

var m,res = [];
var str = "02-Dentist,\"***IN-Den-WV,VA,SC,TN,LA-122016\",Riverside,888-885-6112,5,1,20.00%,1690000";
var re = /"([^"\\]*(?:\\.[^"\\]*)*)"|[^,]+/g;
while((m=re.exec(str)) !== null){
  if (m[1]) 
    res.push(m[1]);
  else  
    res.push(m[0]); 
}
console.log(res);

模式是:

/"([^"\\]*(?:\\.[^"\\]*)*)"|[^,]+/g

its online demo。它将双引号子字符串与内部的任何转义实体一起匹配,并捕获引号之间的内容(使用"([^"\\]*(?:\\.[^"\\]*)*)"),并且还将,以外的1+个字符与[^,]+匹配。

使用if (m[1]),我们可以检查第1组是否匹配,如果匹配,则将第1组(m[1])中的内容推送到最终数组。如果不是,则将整个匹配值推送到数组 (m[0])。

如果您的输入中没有转义实体,您甚至可以使用

/"([^"]*)"|[^,]+/g

regex demo

【讨论】:

  • 如果有转义实体,那么这个正则表达式可以工作/"([^"]*)"|[^,]+/g
【解决方案2】:

var str = "02-Dentist,\"***IN-Den-WV,VA,SC,TN,LA-122016\",Riverside,888-885-6112,5,1,20.00%,1690000";
var result = str.split(/,(?=(?:[^"]*"[^"]*")*[^"]*$)/g);
console.log(result);

【讨论】:

  • "\"***IN-Den-WV,VA,SC,TN,LA-122016\"" 应该像 "***IN-Den-WV,VA,SC,TN,LA-122016"
猜你喜欢
  • 1970-01-01
  • 2012-05-23
  • 2018-05-20
  • 2020-04-05
  • 1970-01-01
  • 2017-04-07
  • 2012-10-30
  • 2013-10-14
  • 1970-01-01
相关资源
最近更新 更多