使用正则表达式替换列的名称

using regex to replace the name of the columns

我正在使用一个程序来重命名工作正常的表名。 SPX 处理键和约束的所有事情,这非常好。我唯一的问题是我正在使用替换来更改表名,但是如果列与表名同名并且它也在更改它,那么问题就会发生,这就是代码失败的地方

这是一个例子

create Table dbo.States(
int int not null identity, 
States nvarchar(100))

因此,如果我将 States 更改为 Provinces,它也会重命名我不想要的列,

检查我是否可以使用正则表达式跳过那里的扩孔,对于其他地方,它应该保持原样替换

我是这样用的

Replace(mytableString, 'States', 'provinces','all')

我不知道 ColdFusion 但我可以向您推荐一个 Java 解决方案。您可以使用正则表达式 States(?=\() 来匹配 table 名称 States 并将其替换为所需的字符串,例如provinces。检查 this 以查看正则表达式的演示和解释。

Java代码:

public class Main {
    public static void main(String[] args) {
        String sql = "create Table dbo.States(\n" + 
                        "int int not null identity, \n" + 
                        "States nvarchar(100))";

        String regex = "States(?=\()";

        String result = sql.replaceAll(regex, "provinces");

        System.out.println(result);
    }
}

输出:

create Table dbo.provinces(
int int not null identity, 
States nvarchar(100))

如我最初的评论所述,

在不知道 if/how 复杂的现实世界 SQL 的情况下,您可以做到

Replace(mytableString, 'States', 'provinces','one')

仅替换第一次出现的 States

更新:

从 Arvind 的 Java 示例答案中借用正则表达式...

如果 SQL 字符串更复杂(例如 CREATE 语句之前的 ALTER 语句等),您可以使用正则表达式向前看在开口 (.

的左侧匹配 States

考虑这个例子:

result = reReplace(exampleSQL, 'States(?=\()', 'Provinces', 'all');

你可以运行一个example code at TryCF.com

更新 2:

鉴于评论中提供的示例 SQL 字符串更复杂并且 table 可能包含在方括号中,您可以执行以下操作以匹配 States 与或者没有 []s 并且它包括 (:

reReplaceNoCase(exampleSQL, '\[?States\]?(?=\()', 'Provinces', 'all')

你可以运行一个example code at TryCF.com

更新 3:

为了消除我对 states 每个 table 引用 需要更新的误解,这里有一个可能比正则表达式更简洁的方法完成 2 次。

// Replace all instances of states as a table declaration
result = replaceNoCase(exampleSQL, '[dbo].[states]', '[dbo].[provinces]', 'all');
// Replace all instances of states as a pk/constraint
result = replaceNoCase(result, '_states', '_provinces', 'all')