替换字符串中的某些子字符串

本文关键字:字符串 替换 | 更新日期: 2023-09-27 18:15:03

给我一些关于替换字符串中的子字符串的建议。

在输入处,我有初始字符串(它总是c#代码)和类的NewName (MyGood)。

初始字符串:

using System;
using Meorfi.Core;
using Meorfi.ViewModel.Shared;
using Meorfi.ViewModel.Shared.Base;
using Meorfi.Wrapper.Base;
namespace Meorfi.ViewModel {
    public partial class ViewModel {
        public ViewModel() {
            Initialize();
        }   
     }
}

在输出时应该是以下字符串:

using System;
using Meorfi.Core;
using Meorfi.ViewModel.Shared;
using Meorfi.ViewModel.Shared.Base;
using Meorfi.Wrapper.Base;
namespace Meorfi.ViewModel {
    public partial class MyGoodViewModel {
        public MyGoodViewModel() {
            Initialize();
        }   
     }
}

问题是:如何只替换类名及其构造函数。

现在,1)使用字符串。替换("视图模型"、"MyGoodViewModel");我将有:

    using System;
    using Meorfi.Core;
    using Meorfi.MyGoodViewModel.Shared;
    using Meorfi.MyGoodViewModel.Shared.Base;
    using Meorfi.Wrapper.Base;
    namespace Meorfi.MyGoodViewModel {
        public partial class MyGoodViewModel {
            public MyGoodViewModel() {
                Initialize();
            }   
         }
    }

2)将"public partial class ViewModel"替换为"public partial class MyGoodViewModel"和

"public ViewModel("与"public MyGoodViewModel("(假设有更多的构造函数)将解决问题,

但是会有更多的空格"public _ partial __ class _ ViewModel"或"public ViewModel _("
当'_' -是空白时,就不会有好的解决方案。

我想用一种非常优雅的方式来做这个。也许我应该用正则表达式来做这个?

提前谢谢你。

编辑:

根据安德鲁的回答,我解决了这个问题。(解决方案如下)

private string ReplaceNames(string code, string newName, string oldName) {
         var classNamePattern = @"(?<=class's)'s*'b" + oldName;
         var ctorPattern = @"(?<=public's)'s*'b" + oldName;
         var updatedCode = Regex.Replace(code, classNamePattern, newName, RegexOptions.IgnoreCase);
         var match = new Regex(ctorPattern).Match(updatedCode);
         if (match.Success) {
            updatedCode = Regex.Replace(updatedCode, ctorPattern, newName, RegexOptions.IgnoreCase);
            return updatedCode;
         }
         return code;
      }

谢谢大家!

替换字符串中的某些子字符串

尝试匹配前面的空格,因为所有的包前面都有点。

string.Replace(" ViewModel", " MyGoodViewModel");

解:

string patternClassName = @"(?<=class's)'s*'S*";
string patternClassConstructor = @"(?<=public's)'s*'S*";
private string Change(string source, string newName)
        {
            string changeClassNameResult = Regex.Replace(source, patternClassName, newName, RegexOptions.IgnoreCase);
            Match match = new Regex(patternClassName).Match(source);
            if (match.Success)
            {
                return Regex.Replace(changeClassNameResult, patternClassConstructor + match.Value, newName, RegexOptions.IgnoreCase);
            }
            else
            {
                return changeClassNameResult;
            }
        }

有很多工具可以做这样的事情(T4即),但如果你想做一些事情并继续,试试这个:

var str = Regex.Replace(@"public
partial class    ViewModel", @"public's*partial's*class's*ViewModel", "public partial class MyGoodViewModel");

str就是public partial class MyGoodViewModel

string.Replace("class ViewModel", "class MyGoodViewModel");
string.Replace("public ViewModel", "public MyGoodViewModel");