所以我一直在尝试将这两个问题的答案结合起来:
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语句,但一旦开始处理嵌套查询,上述方法可能会失败。在这一点上,正则表达式可能不是最好的解决方案,您应该开发一个解析器。