正则表达式匹配另一个单词后跟的字符串

时间:2011-05-26 19:09:03

标签: c# .net regex string

所以我试着编写一个正则表达式,它将匹配一个定义的字符串,然后最终另一个字。例如,在字符串SELECT * FROM persons ORDER BY name ASC LIMIT 10中,我想匹配ORDER BY name ASC LIMIT。看起来它应该很简单,但我无法弄明白。

基本上我不关心ORDER BY和LIMIT之间的什么,但我想在LIMIT停止匹配。以下是我到目前为止的情况:

string pattern = @"\s*ORDER\s*BY.*LIMIT";

但它最终匹配整个SELECT语句,我想停在LIMIT。

提前致谢!

1 个答案:

答案 0 :(得分:5)

请尝试使用此修改后的模式:

string pattern = @"\s*ORDER\s*BY.+?LIMIT";

使用.*可能是罪魁祸首,因为这是一场贪婪的比赛。要使其非贪婪,请为其添加?,使其成为.*?。我个人更喜欢使用.+?,如果我希望之后至少有一个角色匹配。对于\s*,您不必非常贪婪,但可能希望使用\s+来确保至少存在一个空白字符。实际上,您可能希望使用\b来匹配单词边界,而不是根据空白进行思考,这会将模式更改为:

string pattern = @"\bORDER\s+BY\b.+?\bLIMIT\b";

换句话说,匹配单词“ORDER”的开头,后跟至少一个空白字符,匹配“BY”和单词边界(单词的结尾),然后匹配任何字符至少一次,非贪心,直到找到完整的“LIMIT”字样。了解您的数据非常重要,您可以使用第一种模式。字边界有助于避免部分匹配并确保完整的单词匹配。例如,请参阅this related question