所以我试着编写一个正则表达式,它将匹配一个定义的字符串,然后最终另一个字。例如,在字符串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。
提前致谢!
答案 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。