代码之家  ›  专栏  ›  技术社区  ›  Paul Kohler

按字拆分字符串的最佳方法(SQL批处理分隔符)

  •  1
  • Paul Kohler  · 技术社区  · 14 年前

    我有一个类,用于通过批处理分隔符将一个sql命令字符串“拆分”成一个依次运行的sql命令列表,例如“go”。

    ...
    private static IEnumerable<string> SplitByBatchIndecator(string script, string batchIndicator)
    {
        string pattern = string.Concat("^\\s*", batchIndicator, "\\s*$");
        RegexOptions options = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline;
        foreach (string batch in Regex.Split(script, pattern, options))
        {
            yield return batch.Trim();
        }
    }
    

    我当前的实现使用 Regex 具有 yield 但我不确定这是不是最好的方法。

    • 应该很快
    • 它应该处理大字符串(例如,我有一些10MB大小的脚本)
    • 最困难的部分(上面的代码目前没有这样做)是考虑引用的文本

    当前,将错误地拆分以下SQL:

    var batch = QueryBatch.Parse(@"-- issue...
    insert into table (name, desc)
    values('foo', 'if the
    go
    is on a line by itself we have a problem...')");
    
    Assert.That(batch.Queries.Count, Is.EqualTo(1), "This fails for now...");
    

    我考虑过一个基于令牌的解析器,它跟踪开闭引号的状态,但不确定regex是否会这样做。

    任何想法!?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Community basarat    7 年前

    您可以使用 Balancing Group Definition .

    去年也有人问过类似的问题 splitting on whitespace as long as the whitespace wasn't contained in quotes . 你也许可以调整这些答案来找到你要去的地方。