javascript / regex для игнорирования точек с запятой в двойных кавычках

Я немного озадачен этим - у меня есть строка, которая представляет собой строку, разделенную точками с запятой, это будет примерно так:

один; два; три "четыре; пять; шесть"; Семь

Я хотел бы разделить это, используя регулярное выражение в javascript, на такой массив (например, игнорируя любые точки с запятой внутри двойных кавычек):

['один два три четыре пять шесть семь']

Я пробовал адаптировать известные рабочие функции CSV, но кажется, что они могут быть адаптированы для работы с третьим элементом ('три "четыре; пять; шесть";').

Это похоже на проблему с регулярным выражением, но если существует решение, использующее больше, чем регулярное выражение, мне, безусловно, интересно!

update: я также должен отметить, что в строке, заключенной в кавычки, могут быть пробелы до или после точки с запятой. Я обновил пример, чтобы отразить это.


person stockholmux    schedule 08.09.2012    source источник


Ответы (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']

Обратите внимание, что вам нужен негативный прогноз (?!;|$) в начале регулярного выражения, чтобы не допустить соответствует пустой строке, в противном случае метод match по какой-то причине сопоставляет пустые строки перед каждой точкой с запятой.

Обновление:

Я думаю, что это регулярное выражение должно работать и с экранированными кавычками (хотя я был бы признателен за отзывы о правильности). Я также добавил дополнительный \s в шаблон отрицательного просмотра, чтобы убрать пробелы после предыдущей точки с запятой.

/(?!\s|;|$)[^;"]*("(\\.|[^\\"])*"[^;"]*)*/g
person DaoWen    schedule 08.09.2012
comment
Отлично! Как я могу заставить это работать с обоими 'и? var str = 'один; два; три четыре, пять, шесть; Семь'; var str2 = один; два; три 'четыре; пять; шесть'; Семь; - person marknadal; 30.12.2013
comment
@marknadal - похоже, вы хотите, чтобы это работало и для строк в одинарных кавычках. В этом случае попробуйте следующее: (?!\s|;|$)(?:[^;"']*(?:"(?:\\.|[^\\"])*"|'(?:\\.|[^\\'])*')?)* - person DaoWen; 30.12.2013
comment
Работает безупречно, одно из самых впечатляющих регулярных выражений, которые я когда-либо видел. Спасибо. - person marknadal; 31.12.2013

Это разделяет пробелы до и после точки с запятой:

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

Однако он не пытается иметь дело с экранированными кавычками.

person Neil    schedule 09.09.2012