正则表达式:将 SQL PRINT 块与其中带引号的文本进行匹配

发布于 2024-08-12 07:54:17 字数 878 浏览 4 评论 0原文

我尝试使用正则表达式匹配以下文本:

打印转换(NVARCHAR, 当前_时间戳,111) + ' ' + 转换(NVARCHAR,当前_时间戳, 108) + ' -测试模式 : ' + (@turbo_mode_ind = 1 THEN 时的情况 '一些文字''测试''更多文字。' ELSE '以及更多文本''temp''时 它会停止吗?结束)

打印“文字而非文字”

打印'文本''test2''文本'

我想要匹配的是:

打印转换(NVARCHAR, 当前时间戳,111) + ' ' + 转换(NVARCHAR,当前_时间戳, 108) + ' -测试模式 : ' + (@turbo_mode_ind = 1 THEN 时的情况 '一些文本''测试''

打印'文本''test2''

所以基本上我想匹配:

  • 从 PRINT 开始
  • PRINT (.*) 包含换行符之后的每个字符
  • (不要停止于 换行符),
  • 末尾带有 \'{2}\w+\'{2} 匹配
  • 非贪婪 (.*?)
  • 并且 PRINT 之间没有空行 和 \'{2}\w+\'{2}

我已经编写了这个,但它仍然匹配空行:

PRINT.*?\'{2}\w+\'{2}(? !\n\s*\n)

I have the following text I am trying match using regular expressions:

PRINT CONVERT(NVARCHAR,
CURRENT_TIMESTAMP, 111) + ' ' +
CONVERT(NVARCHAR, CURRENT_TIMESTAMP,
108)
+ ' -Test Mode : ' + (CASE WHEN @turbo_mode_ind = 1 THEN
'some text ''test'' some more text.'
ELSE 'and even more text ''temp'' when
will it stop ?' END)

PRINT 'text don''t text'

PRINT 'text ''test2'' text'

What I want to match is:

PRINT CONVERT(NVARCHAR,
CURRENT_TIMESTAMP, 111) + ' ' +
CONVERT(NVARCHAR, CURRENT_TIMESTAMP,
108)
+ ' -Test Mode : ' + (CASE WHEN @turbo_mode_ind = 1 THEN
'some text ''test''

PRINT 'text ''test2''

So basically I want to match:

  • starting at PRINT
  • each char that comes after PRINT (.*)
  • inclusive line-breaks (don't stop at
    line-breaks)
  • with \'{2}\w+\'{2} at the end of the
    match
  • non-greedy (.*?)
  • AND no empty line(s) between PRINT
    and \'{2}\w+\'{2}

I have already compsed this, but it still matches empty line(s):

PRINT.*?\'{2}\w+\'{2}(?!\n\s*\n)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

过期情话 2024-08-19 07:54:17

评论后编辑:

再次查看需求,我无法快速想出一个正则表达式解决方案。在您的评论中,您提到您正在使用 C#。

因此,一个可能的解决方案是首先在空行处分割字符串,然后提取文本。

像这样的事情:

string pattern = @"^$";

foreach (string result in Regex.Split(input, pattern, RegexOptions.Multiline) 
{
    Regex rxFindSql = Regex(@"PRINT.*?\'{2}\w+?\'{2}", RegexOptions.SingleLine)       
    MatchCollection matches = rxFindSql.Matches(result);
}  

这应该可以解决问题,但我没有测试代码。

我希望这有帮助。

Edit after comment:

Looking at the requirements again I could not come up with a single regex solution quickly. In your comments you mention that you are using C#.

A possible solution would therfore be to first split the string at blank lines and then extracting the text.

Something like this:

string pattern = @"^$";

foreach (string result in Regex.Split(input, pattern, RegexOptions.Multiline) 
{
    Regex rxFindSql = Regex(@"PRINT.*?\'{2}\w+?\'{2}", RegexOptions.SingleLine)       
    MatchCollection matches = rxFindSql.Matches(result);
}  

This should do the trick but I did not test the code.

I hope this helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文