【问题标题】:Remove brackets with regular expression in C#在 C# 中使用正则表达式删除括号
【发布时间】:2010-10-05 23:53:59
【问题描述】:

我想从 SQL 字符串中删除方括号,但仅限于其中没有空格的地方。

例如“SELECT [intId], [The Description]”应该返回“SELECT intId, [The Description]”。

我可以用正则表达式得到没有空格的方括号:

\[[^\s]*\]

如何从这些匹配项中删除原始字符串中的方括号?

【问题讨论】:

  • 您确定要这样做吗?字符串文字中的括号呢?还是与保留字匹配的列名?
  • 当然,我知道这里有陷阱。我想我更广泛的问题是如何用匹配本身的内容替换正则表达式匹配。在这个例子的帮助下,我现在明白了。只有在字符串经过一些解析后才会进行这种替换。

标签: c# regex string replace


【解决方案1】:
sql = Regex.Replace(sql, "\\[([^\\s]*)\\]", "$1");

【讨论】:

  • 您可以通过使用@"\[(\S+)\]" 来提高该表达式的可读性
  • 这可能有嵌套括号的问题。是否这样做取决于您正在处理的语法规则。 [foo[bar baz]] 最终会被 foo[bar baz] 取代。
  • 对于SELECT [intId],[intId2], [The Description], [init[x]],这将返回SELECT intId],[intId2, [The Description], init[x]。如果您将 *(贪婪)更改为 *? (不贪婪)结果将是SELECT intId,intId2, [The Description], init[x]
【解决方案2】:

正则表达式是不够的,除了在您的上述特定字符串上一次性使用。如果您在多条 SQL 行上以自动化方式执行此操作,则可能会在删除所需的括号时遇到一堆麻烦。

在这种情况下,您需要更多的 SQL 词法分析器/解析器,它可以帮助您只关注列名,而排除表名、字符串、触发器或函数中的参数等...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多