2011-03-25 21 views
1

我有點問題,因爲我是一個正則表達式新手。如果它很重要,我使用.NET的Regex類。否定字符類匹配字符序列

首先我使用正則表達式中的數據的描述:

這裏是我的表達:

(".*[^".]);(.*")

這這兩條線相匹配(他們是從較大的行的一部分在電腦主機一臺,但基本上將是這個樣子):

例1:7906143476.;180.;903.;1.;1970.;8.;42.;1.;327.;"SST9001";"S;T GORANS SJH "

實施例2:2.;"1;AVD INGENJOR ";"N";"J";" ";

而且也能夠匹配這個(我想它不是沒有匹配):

;"U";33.75;777.;" ";

正則表達式的含義是找到所有分號(;)內引號(「)並用冒號(:)代替。在引號前後不一定總是有分號(如例1)。我想輸出是:

7906143476.;180.;903.;1.;1970.;8.;42.;1.;327.;"SST9001";"S:T GORANS SJH "

2.;"1:AVD INGENJOR ";"N";"J";" ";

最後一行應保持不變,因爲它有一個點和分號之前的任何數量的數字()。

我希望能夠用一個正則表達式匹配所有這些可能的行。我已經有了多個正則表達式的解決方案,但我想要一個更好的方式來做到這一點。我不太瞭解負面/積極的前瞻/背後,但我有一種感覺,那就是解決方案在這個領域的某個地方。

我首先想到的是在否定角色類內部組合一個旁邊,這樣我就可以否定0.75,這是我不想匹配的第一組$ 1。它可以是任何數字,而不是75。

任何幫助都會很棒,因爲我對正則表達式根本不擅長。

謝謝!

回答

1

所以,換句話說,只有當分號是引用字符串的一部分時,才需要用分號替換分號?

假設引號是正確的平衡,不存在引用的字符串(如"2\" by 4\"")中存在的報價,那麼你可以這樣做:

resultString = Regex.Replace(subjectString, 
    @";   # Match a ; 
    (?=   # if it's followed by an odd number of ; -- namely: 
    [^""\r\n]* # 0+ non-quote, non-linebreak characters 
    ""   # One quote 
    (?:   # followed by... 
     [^""\r\n]*"" # an even number of non-quote-quote sequences 
     [^""\r\n]*"" 
    )*   # zero or more times 
    [^""\r\n]* # followed by zero or more non-quotes 
    $    # until the end of the line. 
    )    # End of lookahead", 
    ":", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace); 
+0

謝謝,作品魅力!需要閱讀我認爲的Friedl書。 此外,感謝您提供有關代碼的出色評論,非常適合幫助理解。 – 2011-03-25 15:12:39

+0

是你確定,它工作嗎?..我已經測試過與拉德正則表達式設計器http://www.radsoftware.com.au/regexdesigner/,它不工作.. – 2011-03-25 15:18:29

+0

是啊,每次工作對我來說,什麼字符串是你用?測試? – 2011-03-25 15:25:19

0

另一種建議:在';'上分割,然後遍歷數組,如果當前字符串以「但不結尾」開始,則用下一個帶有':'的字符串連接它,繼續直到找到結尾'''或到達數組末尾

用';'連接所有元素。並打印。

順便說一句,'''不能逃脫?這對於所有解決方案都會使問題變得複雜。

+0

我想過這個選項,但它似乎更清潔,通過正則表達式來做。引號總是出現在甚至數字,並永遠不會逃脫,所以這不會是一個問題,謝謝你ugh =) – 2011-03-25 15:10:55

0

檢查這個表達式:

(?<=("[^"]*";)|([^"];)+)"[^"]*[;][^"]*" 

它匹配中有至少一個分號引號之間的任何東西,但只,如果是由其他引號或東西是沒有加東西之前。這避免了你的問題,我用你提供的字符串進行了檢查。

0

"[^";\n]*?(;)*?[^";\n]*?「,沒有任何環視construct..Its性能應該比其他建議的解決方案更好..你要做的只是用冒號替換組1 \1 ..