3

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

一; 二; 三“四;五;六”;七

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

['一二三四五六七']

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

这似乎是一种正则表达式类型的问题,但如果存在使用多于正则表达式的解决方案,我当然会感兴趣!

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

4

2 回答 2

3

假设您不允许在引号内使用转义引号(例如"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']

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

更新:

我认为这个正则表达式也应该与转义引号一起使用(尽管我很感激关于正确性的反馈)。我还在\s负前瞻模式中添加了额外的内容,以去除前面分号后的空格。

/(?!\s|;|$)[^;"]*("(\\.|[^\\"])*"[^;"]*)*/g
于 2012-09-08T23:59:20.057 回答
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']

它不会尝试处理转义的引号。

于 2012-09-09T00:14:57.387 回答