2016-02-25 4 views
1

Я пытаюсь найти регулярное выражение, которое не будет соответствовать разделителю, если оно завернуто в двойные кавычки. Но он также должен иметь возможность обрабатывать значения, имеющие одну двойную кавычку. У меня есть первая часть вниз ниже выражением где DELIMITER может быть что угодно, но в основном запятые, трубы и двойные трубы:Regex для обработки некорректных файлов с разделителями

DELIMITER(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$) 

Это обрабатывает должным образом формируется CSV rowlike apple, "banana, and orange", grape. Я могу разделить на ограничителе и получить значения:

['apple', 'banana, and orange', 'grape'] 

Моя проблема заключается в том, что я могу столкнуться с линией, как apple, "banana, and orange, grape. В этом случае я хотел бы получить значение:

['apple', '"banana', 'and orange', 'grape'] 

Однако, я получаю:

['apple, "banana', 'and orange', 'grape'] 

Это в основном игнорирует все запятые до двойной кавычки.

Логика, которая у меня есть в голове, заключается в том, что я хочу игнорировать запятую, если ей предшествует двойная кавычка, но только если у нее есть двойная кавычка перед ней. Моя первая мысль состояла в том, чтобы поиграть с внешним видом, но я не могу заставить это работать из-за того, что взгляды не могут обрабатывать квантификаторы (исправьте меня, если это не так).

Я использую Qt QRegExp, который, как я понимаю, более или менее похож на движок регулярных выражений Perl. Пожалуйста, дайте мне знать, если есть дополнительная информация, которую я могу предоставить. Я знаю, что регулярные выражения могут быть искусно основаны на вашей настройке, и я надеюсь, что я объяснил, что я ищу достаточно хорошо!

+0

Что бы вы ищете в случае: яблоко, «банан, апельсин, виноград,» персик, вишня, лимон "Почему не утверждать против несогласованных котировок и заставить пользователя исправить свои входы? – RegularlyScheduledProgramming

+0

Я бы ожидал, что он вернется '['банан, апельсин, виноград,« персик, вишня, лимон »]' Я склоняюсь к простому пропуску по ряду и позволяя восходящей системе знать о плохих данных, но теперь мне просто интересно узнать, возможно ли это. Либо этот пост умрет, кто-то скажет мне, что в настоящее время это невозможно с регулярным выражением, или этот вопрос будет вызывать одно удивительное выражение! – rgrwatson85

ответ

0

Это не QT, а boost :: tokenizer, который имеет только заголовок, поддерживает ускоренные текстовые форматы с разделителями.

Из примера использования в подпиточном документы: http://www.boost.org/doc/libs/1_60_0/libs/tokenizer/escaped_list_separator.htm

// simple_example_2.cpp 
#include<iostream> 
#include<boost/tokenizer.hpp> 
#include<string> 

int main(){ 
    using namespace std; 
    using namespace boost; 
    string s = "Field 1,\"putting quotes around fields, allows commas\",Field 3"; 
    tokenizer<escaped_list_separator<char> > tok(s); 
    for(tokenizer<escaped_list_separator<char> >::iterator beg=tok.begin(); beg!=tok.end();++beg){ 
     cout << *beg << "\n"; 
    } 
} 

В искаженной случае Tok возвращает один маркер, который не то, что вы ищете. Вы ищете нестандартный анализ , рассмотрите возможность написания небольшой конечной машины вместо регулярного выражения.

1. Столько, сколько существует стандартный текст с разделителями

+0

У меня нет поддержки. Я не уверен, что это будет корректно работать для примера ** неправильно. Какой результат будет для «яблока», «банана» и «оранжевого», «винограда». Я хотел бы, чтобы двойная кавычка перед бананом принималась буквально, поэтому, когда она попадает в базу данных, она «банана». – rgrwatson85

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