Regex匹配多个字符串,并在后面进行正向查找



所以我一直在尝试将这两个问题的答案结合起来:
C#拆分字符串,但保留拆分字符\分隔符
Regex匹配多个字符串

从本质上讲,我希望能够围绕某些字符串拆分字符串,并在Regex.Split()的输出数组中也有拆分字符串。以下是我迄今为止所尝试的:

// ** I'd also like to have UNION ALL but not sure how to add that
private const string CompoundSelectRegEx = @"(?<=[b(UNION|INTERSECT|EXCEPT)b])";
string sql = "SELECT TOP 5 * FROM Persons UNION SELECT TOP 5 * FROM Persons INTERSECT SELECT TOP 5 * FROM Persons EXCEPT SELECT TOP 5 * FROM Persons";
string[] strings = Regex.Split(sql, CompoundSelectRegEx);

问题是它开始匹配像E和U这样的单个字符,所以我得到了一个不正确的字符串数组。

我也想围绕UNION ALL进行匹配,但由于这不仅仅是一个单词,而是一个字符串,我不知道如何将其添加到上面的regex中,所以如果有人能在那里为我指明正确的方向,那就太好了!

谢谢!

如果你想对这些单词进行拆分并将它们包含在结果中,只需对它们进行替换并将它们放在一个组中。没有必要四处寻找。这种模式应该适合您的需求:

string pattern = @"b(UNION(?:sALL)?|INTERSECT|EXCEPT)b";

CCD_ 2使得单词CCD_。(?:...)部分表示匹配,但不捕获指定的模式。组末尾的尾随?使其成为可选项。如果要修剪结果,可以在模式的末尾添加s*

请注意,这可能适用于简单的SQL语句,但一旦开始处理嵌套查询,上述方法可能会失败。在这一点上,正则表达式可能不是最好的解决方案,您应该开发一个解析器。

最新更新