替换字符串中的一些子字符串出现

时间:2013-05-24 07:46:28

标签: c# regex string replace

给我一​​些关于替换字符串中的子串的建议。

在输入处,我有初始字符串(始终是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;
      }

谢谢大家!

4 个答案:

答案 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");