如何在字符串中查找特殊字符并替换它们

时间:2018-06-07 02:34:21

标签: c# string

我有一个要求,我必须用新的数据库名称替换动态sql中的数据库名称。

之类的东西
select * from DBName.TableName

需要转换为

select * from newDBName.TableName

-

select * from [DbName.TableName]

需要转换为

select * from [NewDbName.TableName]

2 个答案:

答案 0 :(得分:0)

简单的String.Replace可能无法解决您的问题,因为搜索文本可能出现在您不希望更改的其他地方。

执行此类转换的安全方法是解析SQL语句并执行上下文替换。

答案 1 :(得分:0)

这可以说是正则表达式的一个很好的用例。我建议采用以下简约模式:

(?i)\bDbname\b

这里的想法是在任何情况下使用单词边界\b和内联(?i)不区分大小写的修饰符来匹配字符串。

更复杂的模式可能如下所示:

(?i)(?<=\[|\b)DBNAME(?=\b|\])

Online Demo

Code Sample

为了更严格,我们可以添加一个额外的前锚,例如FROM

(?<=FROM\s+\[?)Dbname(?=\..+?\]?\b)

<强>解释

  • (?<=FROM\s+\[?)使用关键字FROM作为主播,使用一个或多个空白\s字符,然后选择]
  • Dbname有问题的文字字符串
  • (?=\..+?\]?\b)一个积极的前瞻,跨越表名直到下一个单词边界\b出现

我使用lookarounds因为他们没有提供匹配结果$0。这使其易于替换。

Code Sample

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"(?<=FROM\s+\[?)(Dbname)(?=\..+?\]?)";
        string substitution = @"newDbName";
        string input = @"select * from DBName.TableName
select * from [DbName.TableName]";
        RegexOptions options = RegexOptions.Multiline | RegexOptions.IgnoreCase;

        Regex regex = new Regex(pattern, options);
        string result = regex.Replace(input, substitution);
    }
}