JavaScript /正则表达式忽略双引号中的分号

3
我在这个问题上遇到了困难 - 我有一个字符串,几乎是一个分号分隔的字符串,它可能是这样的:
'one; two; three "four; five;six"; seven'
我想使用 javascript 中的正则表达式将其拆分成一个数组,就像这样(例如,忽略双引号内部的任何分号):
['one','two','three "four; five;six"','seven']
我尝试过改编已知的工作 CSV 函数,但它们似乎不能适应第三个元素('three "four;five;six";')。
这似乎是一个正则表达式类型的问题,但如果存在使用不止正则表达式的解决方案,我当然很感兴趣!
更新:我还应该指出,在引号字符串中,分号前后可能会有空格。我已经更新了示例以反映这一点。
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

这太好了!我该如何让它同时使用 ' 和 " 工作? var str = 'one; two; three "four;five;six"; seven'; var str2 = "one; two; three 'four;five;six'; seven"; - marknadal
2
@marknadal - 看起来你想让这个也适用于单引号字符串。在这种情况下,请尝试使用此代码:(?!\s|;|$)(?:[^;"']*(?:"(?:\\.|[^\\"])*"|'(?:\\.|[^\\'])*')?)* - DaoWen
工作得非常完美,这是我见过的最令人印象深刻的正则表达式之一。谢谢。 - marknadal

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']

虽然它不会试图处理转义引号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接