0

我有以下示例文本,我想替换“[核心]。” 用别的东西,但我只想在它不在文本标记之间时替换它'(SQL):

PRINT '[core].[dbo].[FunctionX]' + [core].[dbo].[FunctionX] + '.' 的结果

执行 [核心].[dbo].[FunctionX]

结果应该是:

PRINT '[core].[dbo].[FunctionX]' + [extended].[dbo].[FunctionX] + '.' 的结果

执行 [扩展].[dbo].[FunctionX]

我希望有人能理解这一点。这可以通过正则表达式解决吗?

与 RegLove

凯文

4

2 回答 2

0

这是一个解决方案(javascript):

str.replace(/('[^']*'.*)*\[core\]/g, "$1[extended]");

看到它在行动

于 2010-07-06T15:21:22.220 回答
0

不是一步,也不是在普通的文本编辑器中。如果您的 SQL 在语法上有效,则可以执行以下操作:

首先,从 SQL 中删除每个字符串并用占位符替换。然后你[core]用别的东西代替你。然后从第一步恢复占位符中的文本:

  • 查找所有出现的'(?:''|[^'])+'with 'n',其中n是索引号(匹配的编号)。将匹配项存储在与 具有相同编号的数组中n。这将从输入中删除所有 SQL 字符串并将它们交换为无害的替换,而不会使 SQL 本身无效。
  • 做你的替换[core]。不需要正则表达式,正常的搜索和替换就足够了。
  • 迭代数组,用'1'第一个数组项替换占位符,'2'用第二个替换占位符,最多n. 现在您已经恢复了原始字符串。

正则表达式解释说:

' # 单引号
(?: # 开始非捕获组
  ''|[^'] # 两个单引号,或者不是单引号
)+ # 结束组,至少重复一次
' # 单引号

JavaScript this 看起来像这样:

var sql = 'your long SQL code';
var str = [];

// step 1 - remove everything that looks like an SQL string
var newSql = sql.replace(/'(?:''|[^'])+'/g, function(m) { 
  str.push(m);
  return "'"+(str.length-1)+"'";
});

// step 2 - actual replacement (JavaScript replace is regex-only)
newSql = newSql.replace(/\[core\]/g, "[new-core]");

// step 3 - restore all original strings
for (var i=0; i<str.length; i++){
  newSql = newSql.replace("'"+i+"'", str[i]);
}

// done.
于 2010-07-06T15:07:36.597 回答