替换字符串中的某些子字符串
本文关键字:字符串 替换 | 更新日期: 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");