Regex.Replace 格式化查询

标签 regex vb.net

我在 VB.Net 中工作并尝试使用 Regex.Replace 来格式化我用来查询 Sql 的字符串。我要做的是删除评论“--”。我发现在大多数情况下,以下内容可以满足我的需要。

string = Regex.Replace(command, "--.*\n", "")


string = Regex.Replace(command, "--.*$", "")

但是我遇到了一个问题。如果我的查询中有一个包含双破折号字符串的字符串,它不起作用,替换将只删除从双破折号开始的整行。这让我知道为什么,但我无法弄清楚我需要匹配的正则表达式。

从逻辑上讲,我需要匹配以“--”开头且不以“'”开头且不以“'”开头且其间包含任意数量的字符的字符串。但我不确定如何在正则表达式中表达。我尝试了以下变化:
string  = Regex.Replace(cmd, "[^('.*)]--.*\n[^(.*')]", "")

我知道这显然是错误的。我查看了一些在线资源,包括 http://www.codeproject.com/KB/dotnet/regextutorial.aspx
但由于我缺乏理解,我似乎无法弄清楚这一点。

最佳答案

我认为您的意思是“匹配以 -- 开头的字符串,并且不以 ' 开头,并且不跟在 ' 之后,中间有任意数量的字符”

如果是这样,那么这就是您要查找的内容:

string  = Regex.Replace(cmd, "(?<!'.*?--)--(?!.*?').*(?=\r\n)", "")
'EDIT: modified a little

当然,这意味着您的评论中不能有撇号......如果有人愿意的话,这将非常容易被破解(您不会考虑使用它来防止注入(inject)攻击,是吗? ARE YOU! ??! :D )

如果您愿意,我可以分解表达式,但它与我上面修改过的引用基本相同!

编辑:

我稍微修改了表达式,所以它不消耗任何回车,只有注释本身......表达式说:
(?<!     # negative lookbehind assertion*
  '      #   match a literal single quote
  .*?    #   followed by anything (reluctantly*)
  --     #   two literal dashes
)        # end assertion
--       # match two literal dashes
(?!      # negative lookahead assertion
  .*?    #   match anything (reluctant)
  '      #   followed by a literal single quote
)        # end assertion
.*       # match anything
(?=      # positive lookahead assertion
  \r\n   #   match carriage-return, line-feed
)        # end assertion
  • 否定的lookbehind断言意味着在匹配的这一点上,向后看并断言这不能匹配
  • 否定前瞻断言意味着从这一点向前看并断言这不能匹配
  • 肯定前瞻断言以下表达式可以匹配
  • 不情愿意味着如果您无法匹配后面的表达式,则仅消耗前一个原子的匹配项(. 在这种情况下表示所有内容)。因此 .*? 中的 .*?-- (当应用于字符串 abc-- 时)将消耗 a ,然后检查 -- 是否可以匹配并失败;然后它将消耗 ab ,但再次停止以查看 -- 是否可以匹配并失败;一旦它消耗abc并且--可以匹配(成功),它最终将消耗整个abc--
  • 不情愿或“贪婪”,如果没有 .* 将是 ? 将匹配 abc--.* ,然后尝试将字符串的结尾与 -- 匹配并失败;然后它将回溯,直到它可以匹配 --
  • 另外一个注意事项是 . “任何东西”默认情况下不包括换行符(回车/换行符),这是正常工作所必需的(有一个开关允许 . 匹配换行符,它将打破这个表达式)

  • 一个很好的资源——我学到了 90% 的关于正则表达式的知识——是 Regular-Expressions.info

    小心行事,祝你好运!

    关于Regex.Replace 格式化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8185568/

    相关文章:

    正则表达式条件替换

    mysql - 为 Crystal Reports SQL 命令变量赋值

    sql-server - 新连接的 READPAST 锁问题

    .net - 如何在 vb - asp.net 中拆分带有多字符分隔符的字符串?

    asp.net - 为什么我的类(class)什么都没有?

    c# to vb 转换对象初始化

    java - 如何使用 Java 正则表达式强制某些字符串以新行开头?

    javascript - 正则表达式也阻止换行

    php - 使用 PHP 正则表达式从字符串中提取年份

    java - 如何将此正则表达式设置为 false?