2013-08-05 209 views
0

我工作的一些代碼,從別人那裏繼承並試圖瞭解在C#中的一些正則表達式代碼:正則表達式替換字符串

Regex.Replace(query, @"""[^""~]+""([^~]|$)", 
    m => string.Format(field + "_exact:{0}", m.Value)) 

什麼是上述正則表達式在做什麼?這與來自執行搜索的用戶的輸入有關。它使用第二個參數中提供的模式替換query字符串,並使用第三個參數的值。但那是什麼正則表達式?對我而言,這是沒有意義的。謝謝。

+0

是否[參考](http://www.regular-expressions.info/reference.html ) 幫幫我? – Corak

回答

1

據我所知,xanatos的答案是正確的。我試着去了解正則表達式,所以這裏說到:

"[^"~]+"([^~]|$) 

您可以測試我們的正則表達式,並在http://www.regexpal.com/

1.與單件起到更好的理解)單個字符

第一種模式是文字字符。由於沒有相對立場的陳述,它可能發生在任何地方。

2.)在字符類

[^「〜]

下一個表達式是[] -bracket,這是一個字符集,它定義字符的數量,這可能會在下一步。它是一個單個字符的佔位符。所以讓我們看看裏面,允許其內容:

^「〜

字符類的定義開始的插入符號(^),這是一個特殊字符,在打開方括號後鍵入一個插入符號將取消字符類別,因此它是「倒置的」:跟隨的所有內容,與類別表達式不匹配,匹配且是有效字符。在這種情況下,每個字面字符都是可能的,除了兩個被排除的字符:「或〜」。

3.)的特殊字符

+

下一個表達式,一個加號,告訴引擎嘗試匹配前述令牌一次或多次。 所以定義的字符類應該重複一次或多次以匹配給定的表達式。

4.)單個字符

要匹配,表達式應該進一步含有一種進一步撇號,這將是對應於撇號1中的第一個),因爲在字符類(2),因此(3)不允許一個撇號。

5.)一個環視

([^〜] | $)

這裏要檢查的第一個結構是()-bracket。這被稱爲「Lookaround」。 它是一種特殊的羣體。 Lookaround匹配一個位置。它不擴展正則表達式匹配。 所以這意味着這部分不會嘗試在表達式 中找到任何特定字符,而不是將它們本地化。

本地化需求有兩個條件,它們通過管道符號進行邏輯OR連接: 因此,匹配表達式的下一個字符可以是 [^〜]所有類中的單個字符除了字符〜 或 $行末(或單詞,如果不使用多行模式正則表達式引擎)

我會嘗試編輯我的答案更好的格式,因爲這是我的第一篇文章,我首先必須檢查這是如何工作的..:)

更新: 以「檢測」在該行的前/結束一個星/星,你必須做以下幾點:

首先,它是一個特殊的角色,所以你有一個反斜槓轉義:*

要定義的位置,你可以使用:

  • ^看行的開頭,該行的
  • $結束

整體表現將是:

^*的表達在 開始尋找一個*前面的正則表達式的最後行$ *在終端需求的* 。

....你的情況,你可以在最後一個字符類中添加*檢測到底有*:

([^〜] | $ | $ *)

,並強制*最後,刪除其他條件:

($ *)

PS: (不知我的正則表達式是在格式化的發動機吞了,所以我的更新是錯誤的...)

+0

謝謝,@EpicEmil。你瀏覽了每一個正則表達式並且解釋得很好。非常感激 :) – Alex

1

@使得有必要跳過所有的"與第二個",所以""。如果沒有它可以逃脫",你可能會使用\",但我認爲總是在正則表達式中使用@會更好,因爲\經常使用,而且它永遠不得不將其轉義到\\,因爲它經常被使用。

讓我們看看正則表達式真的是:

Console.WriteLine(@"""[^""~]+""([^~]|$)"); 

"[^"~]+"([^~]|$) 

所以現在我們可以看看 「真正的」 正則表達式。

它尋找"後面緊跟着另一個"隨後是non-~ or the end of the string一個或多個non-" and non-~。需要注意的是,比賽可以字符串開始後啓動,它可能結束的字符串(用non-~

例如在

car"hello"help 

年底前,將匹配"hello"h

+0

謝謝,xanatos。後續操作:如何在字符串的開頭或結尾檢測一個'*'? – Alex

+1

@Alex您必須將其轉義爲''' \ *'...但是你的意思是「檢測」?一個可選的'* *'是'\ *?',所以你可以寫@「\ *?」「[^」「〜] +」「([^_] | $)「(如果你希望*之外的*),然後用標準字符串方法檢查是否有'*'。最後的'[^〜]'已經吃了'*' – xanatos

+0

謝謝@xanatos。檢測是錯誤的詞 - 要知道該模式存在並取代它。所以沒有可以檢測最後一個'*'的正則表達式模式?推薦使用'lastIndexOf()'來做到這一點,並以某種方式將兩者合併爲一張支票? – Alex