所以我一直在尝试结合这两个问题的答案:
C# split string but keep split chars\seperators
Regex to match multiple strings
本质上,我希望能够围绕某些字符串拆分字符串,并在 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 进行匹配,但由于那不仅仅是一个单词,而是一个字符串,我不确定如何将它添加到上面的正则表达式中,所以如果有人能指出我正确的方向,那么会很棒!
谢谢!
最佳答案
如果您想拆分这些词并将它们包含在结果中,只需交替使用它们并将它们放在一个组中。无需环顾四周。这种模式应该符合您的需要:
string pattern = @"\b(UNION(?:\sALL)?|INTERSECT|EXCEPT)\b";
(?:\sALL)?
使单词 ALL
可选匹配。 (?:...)
部分表示匹配但不捕获指定的模式。组末尾的 ?
使其成为可选的。如果您想修剪结果,您可以在模式末尾添加 \s*
。
请注意,这可能适用于简单的 SQL 语句,但一旦您开始处理嵌套查询,上述方法可能会失效。在这一点上,正则表达式可能不是最佳解决方案,您应该改为开发解析器。
关于c# - 正则表达式以匹配多个字符串并向后看,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6127058/