2

我们在一个更面向 SQL 的项目中使用 RoundhouseE 迁移工具。我发现了一个非常奇怪的错误

某个 SQL 函数脚本(遗憾的是我无法提供该脚本,因为它是我客户的属性)使得 RegEx 的 Replace 方法永远不会返回

正则表达式看起来像这样

(?<KEEP1>^(?:[\s\t])*(?:-{2}).*$)|(?<KEEP1>/{1}\*{1}[\S\s]*?\*{1}/{1})|(?<KEEP1>'{1}(?:[^']|\n[^'])*?'{1})|(?<KEEP1>\s)(?<BATCHSPLITTER>GO)(?<KEEP2>\s)|(?<KEEP1>\s)(?<BATCHSPLITTER>GO)(?<KEEP2>$)

RounhouseE 中永不返回的代码行

string sql_statement_scrubbed = regex_replace.Replace(sql_to_run, match => evaluate_and_replace_batch_split_items(match, regex_replace));

问题不在于evaluate_and_replace_batch_split_items实际的 regex.Replace 方法中的委托,我在一个简单的正则表达式工具中尝试了正则表达式,它也挂起。也许这里的 RegEx 专家可以看到问题所在?

编辑:如果我从这个sql注释中删除'-- If no previous, don't report revised (撇号) 它可以工作,但它不仅必须是脚本中其他文本的组合,因为该行独立工作

4

1 回答 1

2

通常,当一个正则表达式需要永远匹配(或者更有可能发现它不匹配)时,这是因为灾难性的回溯。您的正则表达式中有几个实例可能容易出现这种情况,具体取决于您的输入内容。我已经使用了您的正则表达式并对其进行了一些清理,删除了许多不必要的量词和交替。这个正则表达式:

(?<KEEP1>^\s*--.*$)|(?<KEEP1>/\*[\S\s]*?\*/)|(?<KEEP1>'[^']*')|(?<KEEP1>\s)(?<BATCHSPLITTER>GO)(?<KEEP2>\s|$)

将与您的旧正则表达式完全匹配,但它不那么复杂并且应该更稳定。请试一试。

要正确处理字符串 ( 'It\'s something else!') 中的转义撇号,您需要更改正则表达式:

(?<KEEP1>^\s*--.*$)|(?<KEEP1>/\*[\S\s]*?\*/)|(?<KEEP1>'(?:\\.|[^'\\])*')|(?<KEEP1>\s)(?<BATCHSPLITTER>GO)(?<KEEP2>\s|$)
于 2012-11-26T11:46:58.287 回答