我在 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
.
在这种情况下表示所有内容)。因此 .*?
中的 .*?--
(当应用于字符串 abc--
时)将消耗 a
,然后检查 --
是否可以匹配并失败;然后它将消耗 ab
,但再次停止以查看 --
是否可以匹配并失败;一旦它消耗abc
并且--
可以匹配(成功),它最终将消耗整个abc--
.*
将是 ?
将匹配 abc--
与 .*
,然后尝试将字符串的结尾与 --
匹配并失败;然后它将回溯,直到它可以匹配 --
.
“任何东西”默认情况下不包括换行符(回车/换行符),这是正常工作所必需的(有一个开关允许 .
匹配换行符,它将打破这个表达式)一个很好的资源——我学到了 90% 的关于正则表达式的知识——是 Regular-Expressions.info
小心行事,祝你好运!
关于Regex.Replace 格式化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8185568/