使用正则表达式替换列的名称
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')
我正在使用一个程序来重命名工作正常的表名。 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')