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

Бях объркан за малко от този - имам низ, който е почти разделен с точка и запетая, би бил нещо подобно:

един; две; три "четири; пет; шест"; седем

Бих искал да разделя това с помощта на регулярен израз в javascript в масив като този (напр. игнориране на всяка точка и запетая в двойни кавички):

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

Опитах да адаптирам известни работещи CSV функции, но изглежда, че те могат да бъдат адаптирани да работят с третия елемент („три „четири; пет; шест“;“).

Изглежда като проблем тип регулярен израз, но ако съществува решение, използващо повече от регулярен израз, със сигурност се интересувам!

актуализация: Трябва също така да отбележа, че може да има интервали преди или след точката и запетая в цитирания низ. Актуализирах примера, за да отразя това.


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

Имайте предвид, че имате нужда от negative-lookahead (?!;|$) в началото на регулярния израз, за ​​да го предпазите от съвпадение на празния низ, в противен случай методът 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