使用文本标记之外的RegEx替换

时间:2010-07-06 14:43:34

标签: regex replace tags marker

我有以下示例文本,我想替换'[core]。与其他东西但我只想在不在文本标记之间替换它(SQL):

  

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

     

EXECUTE [core]。[dbo]。[FunctionX]

结果应该是:

  

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

     

EXECUTE [extended]。[dbo]。[FunctionX]

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

使用RegLove

凯文

2 个答案:

答案 0 :(得分:0)

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

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

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

正则表达式解释说:

'          # a single quote
(?:        # begin non-capturing group
  ''|[^']  #   either two single quotes, or anything but a single quote
)+         # end group, repeat at least once
'          # a single quote

JavaScript看起来像这样:

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.

答案 1 :(得分:0)

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

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

See it in action