[英]How to find the special characters in a string and replace them
我有一個要求,我必須用新的數據庫名稱替換動態sql中的數據庫名稱。 就像是
select * from DBName.TableName
需要轉換為
select * from newDBName.TableName
---
select * from [DbName.TableName]
需要轉換為
select * from [NewDbName.TableName]
一個簡單的String.Replace可能無法解決您的問題,因為搜索文本可能會出現在您不想更改的其他位置。
進行這種轉換的安全方法是解析SQL語句並執行上下文替換。
對於正則表達式,這可以說是一個很好的用例。 我建議以下簡約模式:
(?i)\bDbname\b
這里的想法是在任何情況下都使用單詞邊界\\b
和不區分大小寫的內聯(?i)
修飾符來匹配字符串。
一個更復雜的模式可能看起來像這樣:
(?i)(?<=\[|\b)DBNAME(?=\b|\])
更嚴格地說,我們可以添加一個額外的前錨,例如FROM
(?<=FROM\s+\[?)Dbname(?=\..+?\]?\b)
說明 :
(?<=FROM\\s+\\[?)
后面使用正號,以使用關鍵字FROM
為錨點,后接一個或多個空格\\s
字符,然后是一個可選的]
Dbname
有問題的文字字符串 (?=\\..+?\\]?\\b)
跨表名的正向查找,直到出現下一個單詞邊界\\b
我使用環視功能,因為它們不貢獻匹配結果$0
。 這使得在替換中易於使用。
代碼示例 :
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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.