我尽量保持简洁。我必须编写一个以 SQL 形式进行查询并搜索 XML 的程序。现在我正在尝试将字符串分解成逻辑片段,以便我可以使用它们。我有一个字符串作为输入,并希望得到一个 MatchCollection 作为输出。
请注意,下面的测试字符串是我强加给用户以保持简单的特殊格式。每行只允许一个语句,并且排除嵌套查询-
string testString = "select apples \n from dblp \r where we ate \n group by all of them \r HAVING NO SHAME \n";
我使用具有以下模式的正则表达式:
Regex reg = new Regex(@"(?<select> \A\bselect\b .)" +
@"(?<from> ^\bfrom\b .)" +
@"(?<where> ^\bwhere\b .)" +
@"(?<groupBy> ^\bgroup by\b .)" +
@"(?<having> ^\bhaving\b .)"
, RegexOptions.IgnoreCase | RegexOptions.Multiline
);
据我所知,这应该给我匹配测试字符串的每个组。我会在每行的开头寻找“select”的完全匹配,然后是除换行符之外的任何字符。
现在我创建集合:
MatchCollection matches = reg.Matches(testString);
为了确保它有效,我使用了一个 foreach 并打印了如下匹配:
foreach(Match match in matches)
{
Console.WriteLine("Select: {0}", match.Groups["select"]);
//and so on
}
问题是集合总是空的。某个地方的正则表达式一定有缺陷,但我太缺乏经验,无法找到它。你能帮帮我吗?非常感谢!
我尝试使用 .* 而不是 . 直到我被告知。甚至会数学多个字符。我毫不怀疑这可能是一个问题,但即使更换它我也没有得到任何结果。
我不明白为什么很难匹配以定义的单词开头并附加任何字符的行,直到正则表达式找到换行符。在我看来,这应该是一个相对容易的任务。