Regex.Replace格式化查询

时间:2011-11-18 16:24:55

标签: 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 但由于我缺乏理解,我似乎无法想出这一点。

2 个答案:

答案 0 :(得分:2)

我认为你的意思是“匹配一个以--开头的字符串,而不是继续,前面是',而后面跟'没有任何数字中间的字符“

如果是这样,那么这就是你要找的东西:

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

当然,这意味着你的评论中不能有撇号......如果有人愿意,你会非常容易被黑客攻击(你不想用它来防止注射攻击,是吗? strong> 是你!??!: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
  • 负面后瞻断言意味着在比赛的这一点上,向后看并断言这不能匹配
  • 否定先行断言意味着从这一点开始向前看并断言这是无法匹配的
  • 正向前瞻断言以下表达式可以匹配
  • 不情愿表示只使用前一个原子的匹配(.,这意味着此情况下的所有内容),如果您无法匹配后面的表达式。因此.*?中的.*?--(当对字符串abc--应用时)将使用a,然后检查--是否可以匹配并失败;它将消耗ab,但再次停止以查看--是否可以匹配并失败;一旦它消耗abc并且--可以匹配(成功),它将最终消耗整个abc--
    • 不情愿或“贪婪” .*没有?abc--.*匹配,然后尝试将字符串的结尾与--匹配并失败;然后它会回溯,直到它匹配--
  • 另外一个注意事项是.“任何”默认情况下不包括新行(回车/换行),这是正常工作所需的(有一个开关允许{ {1}}匹配换行符,它会破坏此表达式)

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

小心谨慎,祝你好运!

答案 1 :(得分:0)

好的,你在这里做的不对:

/[^('.*)]--.*\n[^(.*')]/

您说的如下:

不匹配(,),',。,*然后匹配 - 然后匹配任何东西,直到换行符并且与开头的字符类不匹配。

你可能想要做的是:

/(?<!['"])\s*--.*[\r\n]*/

其中说明,确保您与'"匹配任何空格匹配--以及其他任何内容,直到结尾或换行符或换行符。< / p>