【问题标题】:Regular expression for a single word单个单词的正则表达式
【发布时间】:2009-03-11 13:57:07
【问题描述】:

我正在使用 Regex.Split 在关键字“GO”上拆分 SQL 脚本。我的问题是我似乎无法理解如何让正则表达式进行拆分。我的正则表达式也会在“GO”上拆分,即使它位于如下 SQL 语句中:

Insert into  x(a,b) values(‘please go get some text’,’abc’)

但我只希望它在关键字“GO”上进行拆分。有什么建议吗?

编辑:我正在使用 c#。目前我的正则表达式很简单:

  foreach (string batch in Regex.Split(script, "\\bGO\\b", RegexOptions.IgnoreCase))
  {
    yield return batch;
  }

【问题讨论】:

  • 如果你举个例子说明匹配应该是什么样子,也许会有所帮助。
  • 了解编程语言也可能会有所帮助。
  • 你的正则表达式是什么样的?
  • 好吧,伙计们,我更新了我的问题
  • 如果您的最终游戏是单独执行查询。 stackoverflow.com/questions/40814/…

标签: c# regex


【解决方案1】:

单独在一行上拆分GO,例如:

foreach (string batch in Regex.Split(script, "^GO$\\n", RegexOptions.IgnoreCase | RegexOptions.Multiline))
{
    yield return batch;
}

根据脚本的来源,您可能需要将其更改为 "^GO$\\r\\n"

【讨论】:

  • 那个正则表达式把锚搞混了。另外,请确保设置多行模式:"(?m)^GO$"
【解决方案2】:

如果不以真正正确的方式实现完整的 SQL 解析器(您可能不想这样做),这几乎是不可能的。

另一种方法是诉诸一些技巧(即忽略引号内的文本部分),但如果您的 SQL 在其他地方包含文本“GO”,这仍然不起作用,例如'SELECT * FROM GO'。

【讨论】:

  • +1,正则表达式没有解析SQL的能力,句号。您可能需要重新考虑您的要求。编写一个完整的 SQL 解析器非常重要。
  • @bobince:“非常重要”......矛盾吗? ;-)
  • 呃……这怎么可能是矛盾的?琐碎会很小,因此非琐碎会很大......如果有的话,它是多余的。
【解决方案3】:

您可以在一行中单独搜索“go”。不保证总是有效,但更有可能有效。

【讨论】:

  • 不,我试过了,它也匹配正常语句中的“go”
【解决方案4】:

你可以试试

/;\s去\s;/i

这样,您将覆盖每个 GO 句子,无论它们是否仅在一行中(即其他行中的分号)。

如果您使用查询进一步执行,您可能希望将分号添加回每个查询。

请注意,如果出现“; GO;”发生在插入字符串中,那么如果没有适当的 SQL 解析器,就无法实现您的目标。

【讨论】:

    【解决方案5】:

    这是我用正则表达式解决这个问题的方法。

    var statements = Regex.Split(sql, @"^\s*GO\s*$", 
        RegexOptions.IgnoreCase | RegexOptions.Multiline);            
    

    当它在自己的行上时,它会在“GO”上拆分,并且可以选择用空格包围。这些似乎是 SSMS 强制执行的规则 - 将 GO 与任何其他语句放在一起会导致错误(分号或否)。

    请注意,如果您的脚本在块 cmets 中自己的行上有 GO 语句,它仍然会中断。这是我能想到的唯一错误。

    防弹解决方案是使用 SMO,如 answer 中所述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 2013-12-13
      • 2010-11-15
      • 2021-12-30
      • 2012-01-06
      • 2011-11-19
      相关资源
      最近更新 更多