4

助けが必要な正規表現呼び出しがあります。

ここでは関係ないため、正規表現は投稿していません。私ができるようにしたいのは、置換中に、正規表現に影響を与えているテキスト全体で Html.Encode を実行して ${test} 部分も変更したいということです。

基本的に、正規表現の範囲内にあるテキスト全体を太字タグでラップしますが、太字タグの間のテキストを Html.Encode します。

RegexOptions regexOptions = RegexOptions.Compiled | RegexOptions.IgnoreCase;
text = Regex.Replace(text, regexBold, @"<b>${text}</b>", regexOptions);
4

5 に答える 5

4

これを行うための信じられないほど簡単な方法があります (.net で)。これは MatchEvaluator と呼ばれ、あらゆる種類のクールな検索と置換を行うことができます。基本的には、Regex.Replace メソッドに、文字列を返し、Match オブジェクトを唯一のパラメーターとして受け取るメソッドのメソッド名を渡すだけです。特定の一致 (html エンコード) に適した処理を行うと、返された文字列が入力文字列内の一致のテキスト全体を置き換えます。

例: 2 つの数字が (テキスト内で) 追加されているすべての場所を検索し、式を実際の数字に置き換えたいとします。厳密な正規表現のアプローチではそれを行うことはできませんが、MatchEvaluator を投入すると簡単になります。

public void Stuff()
{
    string pattern = @"(?<firstNumber>\d+)\s*(?<operator>[*+-/])\s*(?<secondNumber>\d+)";
    string input = "something something 123 + 456 blah blah 100 - 55";
    string output = Regex.Replace(input, pattern, MatchMath);
    //output will be "something something 579 blah blah 45"
}

private static string MatchMath(Match match)
{
    try
    {
        double first = double.Parse(match.Groups["firstNumber"].Value);
        double second = double.Parse(match.Groups["secondNumber"].Value);
        switch (match.Groups["operator"].Value)
        {
            case "*":
                return (first * second).ToString();
            case "+":
                return (first + second).ToString();
            case "-":
                return (first - second).ToString();
            case "/":
                return (first / second).ToString();
        }
    }
    catch { }
    return "NaN"; 
}

詳細については、http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.matchevaluator.aspx をご覧ください。

于 2008-09-05T20:17:01.107 に答える
3

この場合は Regex.Replace を使用しないでください... use..

foreach(Match in Regex.Matches(...))
{
    //do your stuff here
}
于 2008-09-05T19:43:12.610 に答える
2

コンテンツから特別な置換文字列を選択してローカライズするために使用したこれの実装を次に示します。

        protected string FindAndTranslateIn(string content)
        {
            return Regex.Replace(content, @"\{\^(.+?);(.+?)?}", new MatchEvaluator(TranslateHandler), RegexOptions.IgnoreCase);
        }

public string TranslateHandler(Match m)
{
    if (m.Success)
    {
        string key = m.Groups[1].Value;
        key = FindAndTranslateIn(key);
        string def = string.Empty;
        if (m.Groups.Count > 2)
        {
            def = m.Groups[2].Value;
            if(def.Length > 1)
            {
                def = FindAndTranslateIn(def);
            }
        }

        if (group == null)
        {
            return Translate(key, def);
        }
        else
        {
            return Translate(key, group, def);
        }
    }
    return string.Empty;
}

マッチ エバリュエーター デリゲートからは、置き換えたいものすべてを返すので、私が返す場所には太字のタグとエンコード呼び出しがあり、私のものは再帰もサポートしているため、必要に応じて少し複雑ですが、例を単純化することができますあなたの要望。

これは、一致のコレクションに対して反復を実行し、メソッドの置換ジョブの一部を実行することと同じです。いくつかのコードを節約するだけで、派手な shmancy デリゲートを使用できるようになります。

于 2008-09-05T20:04:33.430 に答える
0

Regex.Match を実行すると、0 番目のインデックスにある結果の一致オブジェクト グループは、正規表現に一致した入力のサブセットになります。

これを使用して太字のタグをつなぎ合わせ、そこでエンコードできます。

于 2008-09-05T19:44:03.653 に答える
0

{} 内のコードに記入して太字のタグを追加し、テキストをエンコードしていただけますか? テキストブロック全体に変更を適用し、最後にテキスト変数のセクションを置き換える方法について混乱しています。

于 2008-09-05T19:56:38.443 に答える