1

C# を使用して Visual Studios 2013 Express で正規表現を作成しています。単語と !@#$%^&*()_- を含むすべての単一文字列を一重引用符で囲もうとしています:

  • また
  • いいえ
  • 空の()
  • 空ではない()
  • 現在の日付()
  • すでに一重引用符で囲まれている文字列。

これが私の正規表現とその機能のサンプルです: https://regex101.com/r/nI1qP0/1

キャプチャ グループのみを一重引用符で囲み、非キャプチャ グループはそのままにしておきます。これはルックアラウンドで実行できることは知っていますが、方法がわかりません。

4

3 に答える 3

1

マッチ エバリュエーターまたはコールバック メソッドを使用する必要があります。ポイントは、このメソッド内で一致グループとキャプチャ グループを調べて、パターンに応じて実行するアクションを決定できることです。

したがって、このコールバック メソッドを追加します (呼び出し元のメソッドが非静的である場合、非静的である可能性があります)。

public static string repl(Match m)
{
    return !string.IsNullOrEmpty(m.Groups[1].Value) ?
        m.Value.Replace(m.Groups[1].Value, string.Format("'{0}'", m.Groups[1].Value)) :
        m.Value;
}

次に、一致評価器 (=callback メソッド) でのオーバーロードをRegex.Replace使用します。

var s = "'This is not captured' but this is and not or empty() notempty() currentdate() capture";
var rx = new Regex(@"(?:'[^']*'|(?:\b(?:(?:not)?empty|currentdate)\(\)|and|or|not))|([!@#$%^&*_.\w-]+)");
Console.WriteLine(rx.Replace(s, repl));

ラムダ式を使用してコードを短縮できることに注意してください。

Console.WriteLine(rx.Replace(s, m => !string.IsNullOrEmpty(m.Groups[1].Value) ?
    m.Value.Replace(m.Groups[1].Value, string.Format("'{0}'", m.Groups[1].Value)) :
    m.Value));

IDEONE デモを見る

于 2015-07-21T20:32:01.990 に答える