0

正規表現パターンがあり、パターンの一致を別のものに置き換えたいとします。現在のパターンでは、一致する2つのグループがあり、それぞれに番号が付けられています($1と$2)。

Regex pattern = new Regex(@"\[([a-zA-Z0-9_\-]+)\^=([^\]]+)\]");
string replacement = "[starts-with(@$1,$2)]";

CSSセレクターの例:

[id^="blah"]

期待される出力:

[start-swith(@ID,"blah")] // Note ID is capitalized

別の正規表現パターンは次のとおりです。

Regex pattern = new Regex(@"\[([a-zA-Z0-9_\-]+)\*=([^\]]+)\]");
string replacement = "[contains(@$1,$2)]");

置換を実行しているときに、グループ$ 1の一致を大文字にする方法はありますか?

注:リストに追加されるパターンが多数あり、それらは置換文字列とペアになっているため、一致するグループの一部を大文字にする必要があるすべての置換に対してソリューションを機能させる必要があります。

アップデート

考えられる解決策を考えただけだと思います。置換文字列をaに変換し、MatchEvaluator必要に応じて大文字のグループの一致を返します。私はこれがうまくいくかもしれないと思います:

Regex pattern = new Regex(@"\[([a-zA-Z0-9_\-]+)\^=([^\]]+)\]");
MatchEvaluator evaluator = new MatchEvaluator((Match m) =>
    {
        return string.Format("[starts-with(@{0},{1})]", m.Groups[1].Value.ToUpper(), m.Groups[2].Value);
    });

誰かがより良い解決策を考えることができるなら、私に知らせてください。よろしくお願いします!

4

1 に答える 1

1

MatchEvaluatorは大丈夫です、あなたが私を燃やしたと思います;)とにかく:

var pattern = @"([a-z]+) ([a-z]+)";
var format = "[starts-with({0}{1}]";

var input = "bla bla";
var result = ReplacePattern(input, pattern, format);

public static string ReplacePattern(string input, string pattern, string format)
{
   if (Regex.Match(input, pattern).Groups.Count != 3) return input;//or throw, or...
   return Regex.Replace(input, pattern, x =>
            string.Format(format,
                          x.Groups[1].Value.ToUpper(), 
                          x.Groups[2].Value));
}
于 2012-09-26T20:45:57.520 に答える