我对这一点感到难过 - 我有一个字符串几乎是一个分号分隔的字符串,它会是这样的:
一个;二;三“四;五;六”; 7
我想在javascript中使用正则表达式将其拆分为这样的数组(例如,忽略双引号内的任何分号):
['one','two','three“four; five; six”','seven']
我已经尝试调整已知的工作CSV函数,但它们似乎能够适应第三个元素('三个“四个;五个;六个”;')。
这似乎是一个正则表达式的问题,但如果使用的不仅仅是正则表达式,我当然感兴趣!
更新:我还应注意,在带引号的字符串中,分号前后可能有空格。我已经更新了示例来反映这一点。
答案 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']
尽管如此,它并没有尝试处理转义报价。