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