文字列内の部分文字列の置換に関するアドバイスをください。
入力には、初期文字列 (常に 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();
}
}
}
public partial class ViewModel
2) " " を " "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;
}
皆さん、ありがとうございました!