none
正規表現 RRS feed

  • 質問

  • いつもお世話になります。
    Wikiの書式の[[リンク]]みたいなのを一致させる正規表現って、C#ではどう書けばよいですか?
    string wikianchor = "[[(?<wiki>.*?)]]";
    Regex rewiki = new Regex(wikianchor, RegexOptions.IgnoreCase | RegexOptions.Singleline);
    for (Match m = rewiki.Match(text); m.Success; m = m.NextMatch()) {  string link = m.Groups["wiki"].Value;
    }
    と書いたのですが、どうまくヒットしないでいます。
    2010年8月5日 9:33

回答

  • 正規表現中、[ は文字グループ表現の開始を表す文字クラスに割り当てられています。[abc] なら abc のいずれか1文字にマッチって意味ですね。

    ですので、[ を '[' 文字そのものにマッチさせたい場合、エスケープする必要があります。エスケープはその文字の直前に \(バックスラッシュ/半角円記号)を付けることで表現します。ただし、C# では文字列中に \ を使う場合 \\ と記述する必要があるので、結局、検索文字列に \\[ と記述することで、被検索文字列中の [ 文字にマッチさせることが可能になります。

    2010年8月5日 9:41

すべての返信

  • \[\[(?<wiki>.*?)\]\]

     

    カギ括弧[]は、正規表現で特別な意味を持つ記号です。

    なので、カギ括弧を文字列のカギ括弧として認識させるには、エスケープする必要があります。

     

    ※カギ括弧は、カギ括弧内で指定された文字の何れか一文字にマッチするメタ記号です。

    ※エスケープとは、メタ文字(正規表現で特別な意味を持つ記号)を単なる文字列として

    扱うことを表します。

    2010年8月5日 9:40
  • 正規表現中、[ は文字グループ表現の開始を表す文字クラスに割り当てられています。[abc] なら abc のいずれか1文字にマッチって意味ですね。

    ですので、[ を '[' 文字そのものにマッチさせたい場合、エスケープする必要があります。エスケープはその文字の直前に \(バックスラッシュ/半角円記号)を付けることで表現します。ただし、C# では文字列中に \ を使う場合 \\ と記述する必要があるので、結局、検索文字列に \\[ と記述することで、被検索文字列中の [ 文字にマッチさせることが可能になります。

    2010年8月5日 9:41
  • 早速ありがとうございます。
    string wikianchor = "\\[\\[(?<wiki>.*?)\\]\\]";
    でうまくいきました。
    ありがとうございました。
    2010年8月5日 12:51
  • 逐語的リテラル文字列(@""形式の文字列)を使うと「\」を「\\」とせずに記述できるので
    もう少しすっきりすると思います。正規表現用の文字列を扱うときはこれをよく使います。

    string wikianchor = @"\[\[(?<wiki>.*?)\]\]";

    2010年8月5日 22:20