2011-02-22 24 views
3

我有這樣如何提取的正則表達式評論

(?<!(\w/))$#Cannot end with a word and slash 

我想提取結束註釋一個正則表達式。雖然這個例子並沒有反映出這種情況,但是可能會有一個正則表達式,其中包含哈希上的正則表達式。

\##value must be a hash 

什麼將正則表達式是提取評論確保其對正則表達式其中可能包含#的不在註釋中使用時是安全的。

+1

哈希值也可以是字符類:'[#]'。這裏有一個有趣的正則表達式供你解析:'a [#[b \ [\]] \#] \\#'(matches ab#] \) – Kobi

+0

@Kobi:哈哈,你在旋轉我。我是一個白帶正規男人。 –

+0

這是我從我以前的評論(它通過)的詭計正則表達式的正則表達式:http://ideone.com/4w5Q0 – Kobi

回答

7

這裏有一個淨味正則表達式解析部分淨味模式,這應該得到相當接近:

\A 
(?> 
    \\.   # Capture an escaped character 
    |   # OR 
    \[\^?  # a character class 
     (?:\\.|[^\]])* # which may also contain escaped characters 
    \] 
    |   # OR 
    \(\?(?# inline comment!)\#  
     (?<Comment>[^)]*) 
    \) 
    |   # OR 
    \#(?<Comment>.*$) # a common comment! 
    |   # OR 
    [^\[\\#] # capture any regular character - not # or [ 
)* 
\z 

幸運的是,在.net中每個捕獲組記得它的所有捕獲的,而不僅僅是最後,所以我們可以在單個解析中找到所有Comment組的捕獲。正則表達式幾乎可以解析正則表達式 - 但幾乎沒有完全解析,它只是解析足以找到評論。
這裏是你如何使用結果:

Match parsed = Regex.Match(pattern, pattern, 
          RegexOptions.IgnorePatternWhitespace | 
          RegexOptions.Multiline); 
if (parsed.Success) 
{ 
    foreach (Capture capture in parsed.Groups["Comment"].Captures) 
    { 
     Console.WriteLine(capture.Value); 
    } 
} 

工作例如:謹慎http://ideone.com/YP3yt

最後說一句 - 這正則表達式假設整個模式是IgnorePatternWhitespace模式。當它沒有被設置時,所有的#都被直接匹配。請記住,該標誌可能會以單一模式多次更改。例如,在(?-x)#(?x)#comment中,不管IgnorePatternWhitespace,第一個#是字面匹配的,(?x)IgnorePatternWhitespace標誌重新打開,而第二個#被忽略。

如果您想要一個強大的解決方案,您可以使用正則表達式語言解析器。
你或許可以適應的.Net源代碼和提取解析器:

+1

我選擇了基於OP其他標籤的.Net。如果這個模式看起來有點不合適,那是因爲它缺少嵌套的否定字符類:'[az- [ce]]',但它們只能在父類的末尾,才能解析多餘的']'s好。 – Kobi

+0

不錯的工作,非常感謝。 –

+1

@Valamas - 沒問題!讓我知道我是否錯過了任何有趣的邊緣案例。我*認爲*我大部分都是正確的。 – Kobi

1

像這樣的東西應該可以工作(如果你在正則表達式的每一行分別運行它)。評論本身(如果存在)將在第三個捕獲組中。

/^((\\.)|[^\\\#])*\#(.*)/ 

(\\.)相匹配的轉義字符,[^\#]匹配與他們的評論之前,整條生產線匹配*量詞任何非削減非哈希字符一起。然後,正則表達式的其餘部分檢測評論標記並提取文本。

+0

我沒有得到任何匹配。嘗試通過RegexBuddy程序。感謝解釋和幫助到目前爲止。 –

1

一個在正則表達式解析忽視的選項是RightToLeft模式。

從最後提取評論。

人們可以簡單,如果我們的工作我們從線到開頭的年底方式的格局。如

^   
    .+?   # Workable regex 
(?<Comment>  # Comment group 
    (?<!\\)  # Not a comment if escaped. 
    \#   # Anchor for actual comment 
    [^#]+   # The actual commented text to stop at # 
)?    # We may not have a comment 
$ 

使用C#中的上面的圖案與這些選項RegexOptions.RightToLeft | RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline

有可能是一個正則表達式與包括於哈希正則表達式

此行(?<!\\) # Not a comment if escaped.說,如果處理該情況有一個程序\,我們沒有評論。