正则表达式匹配多个字符串,正面看后面

时间:2011-05-25 15:35:03

标签: 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周围进行比赛但是因为那不仅仅是一个单词而是一个字符串我不知道如何将它添加到上面的正则表达式所以如果有人能指出我在正确的方向那么会很棒的!

谢谢!

1 个答案:

答案 0 :(得分:2)

如果您希望拆分这些单词并将其包含在结果中,只需将它们替换并将它们放在一个组中即可。没有需要环顾四周。这种模式应该符合您的需求:

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

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

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