给我一些关于替换字符串中的子串的建议。
在输入处,我有初始字符串(始终是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 ”或
“公共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;
}
谢谢大家!
答案 0 :(得分:2)
尝试匹配之前的空格,因为所有包都在它们之前有点。
string.Replace(" ViewModel", " MyGoodViewModel");
答案 1 :(得分:1)
有很多工具可以做这些事情(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
。
答案 2 :(得分:1)
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;
}
}
答案 3 :(得分:0)
string.Replace("class ViewModel", "class MyGoodViewModel");
string.Replace("public ViewModel", "public MyGoodViewModel");