2016-02-25 64 views
1

我想找到一個正則表達式,如果它被用雙引號括起來,將不會匹配分隔符。但它也必須能夠處理具有單個雙引號的值。我的第一部分來與下面的表達式,其中DELIMITER可能是任何東西,但主要是逗號,管道和雙管子:正則表達式來處理格式不正確的分隔文件

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 ::標記生成器,這是僅標頭,有逃脫分隔符的文本格式的支持。

從升壓文檔的用法示例: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返回單個令牌,這是不是你要找的東西。您正在尋找非標準分析,考慮寫的,而不是正則表達式的小狀態機。

多達存在的分隔符的文本標準

+0

我沒有提供加。我不確定這會對**格式錯誤的**示例正常工作。什麼是輸出爲'蘋果「香蕉,橙,grape'。我希望在香蕉前面的雙引號進行字面理解,所以當它被投入是'數據庫」 banana'。 – rgrwatson85