给我一些关于替换字符串中的子字符串的建议。
在输入中,我有初始字符串(始终是 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) 使用 string.Replace("ViewModel", "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;
}
谢谢你们!