亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用正則表達式僅替換某些組

用正則表達式僅替換某些組

有只小跳蛙 2019-10-25 11:14:37
假設我有以下正則表達式:-(\d+)-我想使用C#將Group 1 (\d+)替換為AA,以獲得:-AA-現在,我使用以下方法替換它:var text = "example-123-example";var pattern = @"-(\d+)-";var replaced = Regex.Replace(text, pattern, "-AA-"); 但是我并不是很喜歡這樣,因為如果我更改模式以匹配_(\d+)_,那么我也將不得不替換替換字符串_AA_,這違反了DRY原則。我正在尋找類似的東西:使匹配的文本保持原樣,但將Group 1 by this text和Group 2 by another text...編輯:那只是一個例子。我只是在尋找一種通用的方式來做我上面說的話。它適用于:anything(\d+)more_text 以及您可以想象的任何模式。我要做的就是只替換組,并保留其余的比賽。
查看完整描述

3 回答

?
江戶川亂折騰

TA貢獻1851條經驗 獲得超5個贊

一個好主意是將所有內容封裝在組中,無論是否需要標識它們。這樣,您可以在替換字符串中使用它們。例如:


var pattern = @"(-)(\d+)(-)";

var replaced = Regex.Replace(text, pattern, "$1AA$3"); 

或使用MatchEvaluator:


var replaced = Regex.Replace(text, pattern, m => m.Groups[1].Value + "AA" + m.Groups[3].Value);

有點混亂的另一種方法是使用后向/超前:


(?<=-)(\d+)(?=-)


查看完整回答
反對 回復 2019-10-25
?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

您可以使用lookahead和lookbehind進行此操作:


var pattern = @"(?<=-)\d+(?=-)";

var replaced = Regex.Replace(text, pattern, "AA"); 


查看完整回答
反對 回復 2019-10-25
?
www說

TA貢獻1775條經驗 獲得超8個贊

我也有此需要,并為此創建了以下擴展方法:


public static class RegexExtensions

{

    public static string ReplaceGroup(

        this Regex regex, string input, string groupName, string replacement)

    {

        return regex.Replace(

            input,

            m =>

            {

                var group = m.Groups[groupName];

                var sb = new StringBuilder();

                var previousCaptureEnd = 0;

                foreach (var capture in group.Captures.Cast<Capture>())

                {

                    var currentCaptureEnd =

                        capture.Index + capture.Length - m.Index;

                    var currentCaptureLength =

                        capture.Index - m.Index - previousCaptureEnd;

                    sb.Append(

                        m.Value.Substring(

                            previousCaptureEnd, currentCaptureLength));

                    sb.Append(replacement);

                    previousCaptureEnd = currentCaptureEnd;

                }

                sb.Append(m.Value.Substring(previousCaptureEnd));


                return sb.ToString();

            });

    }

}

用法:


var input = @"[assembly: AssemblyFileVersion(""2.0.3.0"")][assembly: AssemblyFileVersion(""2.0.3.0"")]";

var regex = new Regex(@"AssemblyFileVersion\(""(?<version>(\d+\.?){4})""\)");



var result = regex.ReplaceGroup(input , "version", "1.2.3");

結果:


[assembly: AssemblyFileVersion("1.2.3")][assembly: AssemblyFileVersion("1.2.3")]


查看完整回答
反對 回復 2019-10-25
  • 3 回答
  • 0 關注
  • 963 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號