2015-10-08 2 views
1

Скажут, у меня есть файл строки, какRegex в соответствии недопустимый CSV строки с неэкранированными кавычками

11,"abc","def" 
12,"ab "c"","def" // invalid 
13,"ab,"c"","def" // invalid 
14,""a" b,c","def" // invalid 
15,""a", "b"c","def" // invalid 

Как вы можете увидеть некоторые из двойных кавычек являются неэкранированными. Я хочу отфильтровать недопустимые строки, прежде чем попытаюсь их проанализировать.

Я собираюсь сделать что-то вроде \,\".+\"\,, чтобы найти токен, а затем проверить, что он не содержит "," внутри. Но я не могу понять, как заставить его работать.

Я искал в SO, но не нашел ответа, который работает на меня.

спасибо.

+0

На всякий случай - я бы предпочел решение, совместимое с Java. – cyrillk

+0

Вы могли бы добавить ожидаемый результат? например, для: '13," ab, "c" "," def "' –

+1

Это, вероятно, не проблема, которую вы должны решать только с помощью регулярных выражений; будет намного проще написать парсер, обрабатывающий столбец за раз. Предполагая, что вам не нужно обрабатывать произвольно искаженный ввод (т. Е. Что ваши недопустимые входы имеют некоторый шаблон), это не должно быть слишком сложно. – beerbajay

ответ

1

Если строка всегда начинается и заканчивается ", вы можете попробовать с этим Java регулярным выражением:

(?<=,\s{0,99}"|(?!\A)\G)[^"]+|(?<=(?!\A)\G|")(")(?!\s*[,\n]|$) 

DEMO

группа 1 захват недействительные котировки, вы можете получить индексы с matcher.start(1) и matcher.end(1). \s{0,99} будет работать только на Java.

+0

Спасибо! Почему он выделяет все строки? – cyrillk

+0

@cyrillk, потому что он соответствует символам '' 'после запятой и' '' или '' 'знак, если он соответствует уже согласованному тексту, который не сопровождается запятой. Первое совпадение (не-' '' символов) заключается в том, чтобы найти только «метки» внутри строки. Также в Regex101 '\ s {0,99}' не будет работать, поэтому один пример не выделен, но в Java он будет работать –

Смежные вопросы