0

文字列内の部分文字列の置換に関するアドバイスをください。

入力には、初期文字列 (常に 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 ViewModel2) " " を " "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;
      }

皆さん、ありがとうございました!

4

4 に答える 4

2

すべてのパッケージの前にドットがあるため、前のスペースも一致させてみてください。

string.Replace(" ViewModel", " MyGoodViewModel");
于 2013-05-24T07:51:29.110 に答える
1

そのようなことを行うためのツールはたくさんあります (T4 ie) が、何かをやりたい場合は、これを試してください:

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

strなりますpublic partial class MyGoodViewModel

于 2013-05-24T08:18:45.310 に答える
0
string.Replace("class ViewModel", "class MyGoodViewModel");
string.Replace("public ViewModel", "public MyGoodViewModel");
于 2013-05-24T07:51:43.517 に答える