javascript / regex忽略双引号中的分号

时间:2012-09-08 23:38:12

标签: javascript regex split

我对这一点感到难过 - 我有一个字符串几乎是一个分号分隔的字符串,它会是这样的:

  

一个;二;三“四;五;六”; 7

我想在javascript中使用正则表达式将其拆分为这样的数组(例如,忽略双引号内的任何分号):

  

['one','two','three“four; five; six”','seven']

我已经尝试调整已知的工作CSV函数,但它们似乎能够适应第三个元素('三个“四个;五个;六个”;')。

这似乎是一个正则表达式的问题,但如果使用的不仅仅是正则表达式,我当然感兴趣!

更新:我还应注意,在带引号的字符串中,分号前后可能有空格。我已经更新了示例来反映这一点。

2 个答案:

答案 0 :(得分:2)

假设您不允许在引号内使用转义引号(例如"this has \"escaped quotes\" inside"),那么这应该有效:

var rx = /(?!;|$)[^;"]*(("[^"]*")[^;"]*)*/g;
var str = 'one; two; three "four;five;six"; seven';
var res = str.match(rx)
// res = ['one', ' two', ' three "four;five;six"', ' seven']

请注意,在正则表达式的开头需要negative-lookahead (?!;|$)以防止它与空字符串匹配,否则match方法会匹配每个字符串前面的空字符串分号由于某种原因。

更新

我认为这个正则表达式也适用于转义引号(尽管我很欣赏有关正确性的反馈)。我还在负前瞻模式中添加了额外的\s以在前一个分号后删除空格。

/(?!\s|;|$)[^;"]*("(\\.|[^\\"])*"[^;"]*)*/g

答案 1 :(得分:0)

这会在分号前后删除空格:

'one; two; three "four;five;six"; seven'.match(/(?!;| |$)([^";]*"[^"]*")*([^";]*[^ ";])?/g)

['one', 'two', 'three";four;five;six"', 'seven']

'one ; two"; three ; "four" ; five ; "six ; seven'.match(/(?!;| |$)([^";]*"[^"]*")*([^";]*[^ ";])?/g)

['one', 'two" ; three ; "four" ; five ; "six', 'seven']

尽管如此,它并没有尝试处理转义报价。