我被这个问题难住了——我有一个字符串几乎是一个分号分隔的字符串,它应该是这样的:
one; two; three "four; five;six"; seven
我想使用 javascript 中的正则表达式将其拆分成这样的数组(例如,忽略双引号内的任何分号):
['one','two','three "four; five;six"','seven']
我已经尝试过调整已知的 CSV 函数,但它们似乎能够适应第三个元素(“三“四;五;六”;”)。
这似乎是一个正则表达式类型的问题,但如果存在使用超过正则表达式的解决方案,我当然很感兴趣!
更新:我还应该注意,引用字符串中分号前后可能有空格。我更新了示例以反射(reflect)这一点。
最佳答案
假设您不允许在引号内使用转义引号(例如 "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
关于javascript/regex 忽略双引号中的分号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12335355/