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();
            }   
         }
    }

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;
      }

谢谢你们!

4

4 回答 4

2

尝试匹配之前的空格,因为所有的包前面都有点。

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

y 解决方案:

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;
            }
        }
于 2013-05-24T08:22:33.277 回答
1

有很多工具可以做这些事情(T4 ie),但如果你想做一些事情并继续,试试这个:

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

并且strpublic 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 回答