2011-02-22 14 views
3

を抽出するために、どのように私は、私は端からコメントを抽出したいと思い、この正規表現コメント

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

のような正規表現を持っています。この例はこのケースを反映していませんが、正規表現にはハッシュに正規表現を含めることができます。正規表現は、コメントではありません# 'sに含まれている可能性があり、正規表現に対して使用する場合、それは安全である保証するコメントを抽出することです何

\##value must be a hash 

+1

ハッシュは、文字クラスにすることもできます: '[#]'。あなたが解析するための楽しい正規表現があります: '' [#[b \ [\]] \#] \\# '(ab#)\) – Kobi

+0

@ Kobi:lol、あなたは私を紡ぎ出しています。私はホワイトベルトの正規表現の男です。 –

+0

ここに私の前のコメント(それがパスする)からのトリックの正規表現との私の正規表現は:http://ideone.com/4w5Q0 – Kobi

答えて

7

は.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); 
    } 
} 

の作業例: - この正規表現は、全体のパターンがIgnorePatternWhitespaceモードであると仮定し、注意のhttp://ideone.com/YP3yt

最後の一言
は、ここでは、その結果を使用する方法です。設定されていない場合は、すべて#が文字通り一致します。フラグは1つのパターンで複数回変更される可能性があることに注意してください。例えば、IgnorePatternWhitespaceにかかわらず、は、文字通り一致し、(?x)は、IgnorePatternWhitespaceフラグを戻し、第2の#は無視されます。(?-x)#(?x)#commentでは、たとえば、IgnorePatternWhitespaceに関係なく、最初の#は文字通り一致します。

堅牢なソリューションが必要な場合は、正規表現のパーサーを使用できます。
おそらくネットのソースコードを適応し、パーサを抽出することができます。正規表現の構文解析で見落とさオプションの

+1

私はOPの他のタグに基づいて.Netを選択しました。このパターンがちょっと見えないのは、 '[az- [ce]]'ネストされた文字クラスがネストされていないからです。しかし、それらは親クラスの終わりに来るだけで、余分な ']'を解析することができますよく – Kobi

+0

素敵な仕事、ありがとう。 –

+1

@Valamas - 問題ありません!私が興味深いエッジケースを見逃しているかどうかを教えてください。私は思う。 – Kobi

1

正規表現の各行で別々に実行する場合は、このようなものが動作するはずです。コメント自体(存在する場合)は、3番目のキャプチャグループになります。

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

(\\.)[^\#]は、任意のは、彼らがコメントする前に、行全体が一致し*数量詞と一緒に、非ハッシュ文字を非スラッシュ一致し、エスケープ文字に一致します。正規表現の残りの部分はコメントマーカーを検出し、テキストを抽出します。

\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の各キャプチャグループはそのキャプチャのすべてを覚えて、ちょうど最後のではない:ここでは

+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 
$ 

として正規表現があるかもしれませんRegexOptions.RightToLeft | RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline

これらのオプションを使用してC#で上記のパターンを使用してハッシュ

上の正規表現が含まれてこの行(?<!\\) # Not a comment if escaped.があれば言ってそのような状況を処理します手続きがあります\、私たちはコメントはありません。