【问题标题】:Replace using RegEx outside of text markers在文本标记之外使用 RegEx 替换
【发布时间】:2010-07-06 14:43:33
【问题描述】:

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

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

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

结果应该是:

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

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

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

与 RegLove 一起

凯文

【问题讨论】:

    标签: regex replace tags marker


    【解决方案1】:

    不是一步,也不是在普通的文本编辑器中。如果你的 SQL 在语法上是有效的,你可以这样做:

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

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

    正则表达式,解释:

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

    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.
    

    【讨论】:

      【解决方案2】:

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

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

      See it in action

      【讨论】:

      • "PRINT 'The result of ''[core].[dbo].[FunctionX]''' + [core].[dbo].[FunctionX] + '.' EXECUTE [core].[dbo].[FunctionX]"?
      • 您是否为点击链接而烦恼?因为我不知道你从哪里复制你的输出......有一个工作示例。去看看吧。
      • 您是否为尝试使用我发布的字符串而烦恼? ;-) 因为这个字符串不起作用。
      • 那不是输入,那是无效的 SQL。 :)
      • 不,不是。再看一遍。 ;-)
      猜你喜欢
      • 1970-01-01
      • 2021-10-22
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多