为了账号安全,请及时绑定邮箱和手机立即绑定

用正则表达式仅替换某些组

用正则表达式仅替换某些组

有只小跳蛙 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 关注
  • 860 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信