6

同じ行の前に特定の文字がない場合にのみパターンを一致させるにはどうすればよいですか?

次の正規表現コードがあります。

pattern = @"(?<=^|[\s.(<;])(?<!//)(" + Regex.Escape(keyword) + @")(?=[\s.(>])";
replacement = "<span style='" + keywordStyle + "'>$1</span>";
code = Regex.Replace(code, pattern, replacement);

同じ行の前に 2 つのスラッシュがない場合にのみ一致する基準を追加したいと思います (C# コメント)。

私はそれをいじって、パターンを修正しました:

pattern = @"(?<!\/\/)(?<=^|[\s.(<;])(?<!//)(" + Regex.Escape(keyword) + @")(?=[\s.(>])";

しかし、どうやらこれは、2 つのスラッシュがキーワードの直前の2 文字である場合にのみ機能します。

したがって、このパターンは「//foreach」には一致しませんが、「// foreach」には一致します。

この場合、負の後読みを使用できますか、または負の後読み以外の方法でこれを達成できますか?

ありがとうございました。

編集:

私は十分に明確ではなかったと思います。私の問題を繰り返すには:

私は構文の強調表示に取り組んでおり、「foreach」などの C# キーワードの一致を見つける必要があります。ただし、2 つのスラッシュで定義されるコメントも考慮する必要があります。コメントの一部である場合、キーワード「foreach」と一致させたくありません(同じ行の前のどこかに2つのスラッシュがあります。

この場合、「// some text foreach」のように、スラッシュが必ずしもキーワードの直前にあるとは限らないため、否定的な後読みは役に立ちません。この foreach を一致させたくありません。

繰り返しますが、私の質問は次のとおりです。2 つのスラッシュが同じ行の前にない場合にのみ一致するようにパターンを変更するにはどうすればよいですか?

私の質問が今明確であることを願っています。

4

4 に答える 4

4

正規表現パターンを少し単純化して、次はどうですか?「//」に貪欲でない一致を加え、その後0文字以上を使用します。

(?<!//.*?)(?<Keyword>foreach)
于 2012-08-12T22:27:25.117 に答える
1

何をしようとしているのか正確にわからないと、最善の解決策を言うのは難しいですが、特に行ごとに複数のキーワードがある場合は、正規表現を試す前に // の行の先頭をチェックするだけです。

于 2012-08-12T19:58:26.690 に答える
1

これを試して:

^\s*(?<!//.*)\s*foreach

C# コード分析については、信頼できるオープンソースのIrony - codeplexの .NET Language Implementation Kitを試してください。

于 2012-08-13T05:36:36.623 に答える
1

構文の強調表示を使用している場合は、次の CodeProject の記事を参照してください: Fast Colored TextBox for Syntax Highlighting このプロジェクトは、構文の強調表示も行うコード エディター ウィンドウに関するもので、正規表現を使用します。多分それはあなたが必要とすることをします(そして多分それ以上)。これの作成者は、構文の強調表示について多くのことを考えているようです。ここで話された foreach と、コメントの一部である場合は「foreach」を試してみましたが、うまく表示されました。

于 2012-08-16T21:54:41.777 に答える