c# - 正则表达式以匹配多个字符串并向后看

标签 c# regex .net-3.5 string

所以我一直在尝试结合这两个问题的答案:
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/

相关文章:

c# - MVVM 模型到 ViewModel 的通信

c# - 如果行存在则更新行否则使用 Entity Framework 插入逻辑

c# - 很难找到在正则表达式中插入 "word exclusion"的位置

javascript - 正则表达式中的 `\\s`是什么意思

c# - DirectoryInfo.CreationTime 返回奇怪的日期

c# - Windows 服务配置文件

c# - Ajax.BeginForm 中的 LoadingElementId 不显示加载图像

c# - 检索包含混合内容的完整 XElement 字符串

php - 使用正则表达式删除字符串的一部分

c# - Linq 错误 "Could not find an implementation of the query pattern for source type ' System.Linq.IQueryable“未找到加入”