2013-04-02 43 views
1

我想寫一個正則表達式來查找所有';'不跟隨NEW LINE(\ n)字符的字符。沒有LookBehind特性的正則表達式

;(?!\\\n) 

和所有NEW LINE(\ n)字符沒有在前面加';'性格:

(?< !;)\\\n 

不幸的是,我使用Qt 4.7.4 QRegExp,它不支持「向後看」。如何重寫上面的正則表達式,以便它不使用「Look Behind」?

回答

1

從文檔引用:

http://doc.qt.digia.com/4.7/qregexp.html#details

兩個零寬度正和零寬度排除模式斷言(?= pattern)和(?!圖案)與相同的語法支持Perl的。

什麼是可能發生的事情是,你已經插入\r\n,而不僅僅是一個\n ...也許這是一個Windows機器上創建一個文本文件在Windows機器上運行。

有一點需要注意的是,我發現了lookbehinds,你不能有一個可變長度lookbehind與大多數正則表達式處理程序在那裏。

如果lookbehinds /向前看符號仍然給你的麻煩,其他選項以考慮使用捕捉組,然後只指的是你感興趣的捕獲組。

從它的文檔的code-examples section此:

str = "Nokia Corporation\tqt.nokia.com\tNorway"; 
QString company, web, country; 
rx.setPattern("^([^\t]+)\t([^\t]+)\t([^\t]+)$"); 
if (rx.indexIn(str) != -1) { 
    company = rx.cap(1); 
    web = rx.cap(2); 
    country = rx.cap(3); 
} 

A捕獲組與括號限定,並且由它的索引以後訪問從1開始的第零指數是整個匹配(未破碎成捕獲基團)。

http://doc.qt.digia.com/4.7/qregexp.html#cap

http://doc.qt.digia.com/4.7/qregexp.html#capturedTexts

希望有所幫助。正常表達式在工作正常時可以很有趣。祝你好運。

我也喜歡用這個tool。格式可能與QRegEx有一些不同,但翻譯和測試一旦完成,相當快。

UPDATE: 這裏是一個全套的,顯示出4個不同的拍攝字符串,他們找到QRegEx什麼關:

#include <QCoreApplication> 
#include <QRegExp> 
#include <QString> 
#include <QDebug> 
#include <QStringList> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    QString str = 
      "This is a long string;\n" 
      "with some semi colons;\n" 
      "sometimes followed by a new line;\n" 
      "and other times followed; by something else.\n" 

      "(;)([^\\n]) find a semicolon and a new line\n" 
      "(;)(?!\\n) find a semicolon not followed by a new line, negative look-ahead\n" 

      "([^;])(\\n) find a non semicolon and a new line\n" 
      "(?<!;)(\\n) find a new line, not preceeded by a semicolon.\n"; 

    QList <QRegExp> rx_list; 

    QRegExp rx_colon_and_non_newline; 
    rx_colon_and_non_newline.setPattern("(;)([^\\n])"); 

    QRegExp rx_colon_and_neg_lookahead; 
    rx_colon_and_neg_lookahead.setPattern("(;)(?!\\n)"); 

    QRegExp rx_non_colon_and_newline; 
    rx_non_colon_and_newline.setPattern("([^;])(\\n)"); 

    QRegExp rx_neg_lookbehind_and_newline; 
    rx_neg_lookbehind_and_newline.setPattern("(?<!;)(\\n)"); 

    rx_list << rx_colon_and_non_newline 
      << rx_colon_and_neg_lookahead 
      << rx_non_colon_and_newline 
      << rx_neg_lookbehind_and_newline; 

    foreach(QRegExp rx, rx_list) 
    { 
     int count = 0; 
     int pos = 0; 
     qDebug() << "Pattern" << rx.pattern(); 
     while ((pos = rx.indexIn(str, pos)) != -1) { 
      QStringList capturedTexts(rx.capturedTexts()); 

      for(int i = 0; i<capturedTexts.size(); i++) 
       capturedTexts[i].replace('\n',"\\n"); 

      qDebug() << "\t" << count << "Found at position" << pos << capturedTexts; 
      // qDebug() << rx.cap(); 
      pos += rx.matchedLength(); 
      ++count; 
     } 
     if(count == 0) 
      qDebug() << "\tNo matches found."; 
    } 


    return a.exec(); 
} 

輸出:

Pattern "(;)([^\n])" 
     0 Found at position 104 ("; ", ";", " ") 
     1 Found at position 126 (";)", ";", ")") 
     2 Found at position 169 (";)", ";", ")") 
     3 Found at position 247 (";]", ";", "]") 
     4 Found at position 295 (";)", ";", ")") 
Pattern "(;)(?!\n)" 
     0 Found at position 104 (";", ";") 
     1 Found at position 126 (";", ";") 
     2 Found at position 169 (";", ";") 
     3 Found at position 247 (";", ";") 
     4 Found at position 295 (";", ";") 
Pattern "([^;])(\n)" 
     0 Found at position 123 (".\n", ".", "\n") 
     1 Found at position 166 ("e\n", "e", "\n") 
     2 Found at position 242 ("d\n", "d", "\n") 
     3 Found at position 289 ("e\n", "e", "\n") 
     4 Found at position 347 (".\n", ".", "\n") 
Pattern "(?<!;)(\n)" 
     No matches found. 
+0

我不知道,應該不是這個答案是公認。在我看來,我完全同意使用捕獲組比使用look-behind/ahead更好。我使用LA/LB的唯一真正原因是,當我需要快速過濾某些內容時,在命令行上處理grep時,或者偶爾使用GREP或SED編寫腳本,除此之外我不使用它,甚至不使用它與Perl,因爲在這一點上不再有意義不使用捕獲。而且,消極的後顧之道無論如何都是吸吮的,因爲它們必須是固定的長度;當你不知道字符串到底有多長時,這會很煩人! – osirisgothra

+0

我花了很長時間才發現無法使用可變長度的後視圖。我以爲我瘋了。我可能應該重新回顧這個答案,並且提出一個完整的測試和解決方案,展示它應該如何完成。這裏是更多關於這個問題的答案:http://stackoverflow.com/search?q=user%3A999943+qregex – phyatt

相關問題