2013-05-24 3 views
0

GIve мне несколько советов относительно замены подстрок в строке.Замена некоторого подстроки внутри строки

На входе у меня есть исходная строка (это всегда код 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) using 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(" (предполагая, что есть больше Конструкторы), позволит решить проблему,

, но если будут какие-то более пустых пространств «общественности _ парциальное __ класса _ ViewModel» или "public ViewModel _ ( "
где '
_' - это пробелы, не будет хорошего решения.

Я хочу сделать это очень элегантно. Может быть, я должен использовать Regex для этого?

Заранее спасибо.

Редактировать: Основываясь на ответе Andrew, я решил проблему. (Решение следует)

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

Спасибо всем!

+1

Поиск индекса п пространства имен и не заменяет, начиная с этого индекса. – Tommi

+0

Если это всегда код C#, почему вы не можете использовать функцию переименования Visual Studio? –

ответ

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

Попробуйте сопоставить пространство перед этим, так как все пакеты имеют точки перед ними.

string.Replace(" ViewModel", " MyGoodViewModel"); 
+0

Заготовки - неправильное решение. Я уже пробовал. – meorfi

+0

@meorfi почему бы не работать? в вашем классе и ctor (s) у вас всегда есть пробел раньше, иначе он не будет компилироваться - в равной мере вы не можете иметь пробел перед входом – NDJ

+0

@meorfi Можете ли вы привести пример того, где это не будет работать ты? Если у вас есть особые случаи, которые не отражаются в вопросе, вам будет сложно помочь с любым решением регулярных выражений. – melwil

0
string.Replace("class ViewModel", "class MyGoodViewModel"); 
string.Replace("public ViewModel", "public MyGoodViewModel"); 
1

Есть много инструментов для выполнения таких вещей (Т4 то есть), но если вы хотите сделать что-то сделать, и идти дальше, попробуйте следующее:

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

И str будет public partial class MyGoodViewModel.

Смежные вопросы