【问题标题】:Regex to Match a String Followed By a Another Word正则表达式匹配字符串后跟另一个单词
【发布时间】:2011-09-02 21:07:30
【问题描述】:

所以我正在尝试编写一个正则表达式来匹配定义的字符串,然后最终匹配另一个单词。例如在字符串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 处停止。

提前致谢!

【问题讨论】:

  • 当我运行这个正则表达式时,它运行良好......
  • 如果你在一个包含多个子选择的更复杂的字符串上运行它会失败
  • 基本上它不会在第一个 LIMIT 实例处停止,它会在 LIMIT 的最后一个实例处停止

标签: c# .net regex string


【解决方案1】:

试试这个修改后的模式:

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

使用.* 可能是罪魁祸首,因为它是一个贪婪的匹配。为了使它不贪婪,添加一个?,使其成为.*?。如果我希望之后至少匹配一个字符,我个人更喜欢使用.+?。对于\s*,您不会关心使其不贪婪,但可能希望使用\s+ 来确保至少存在一个空白字符。实际上,您可能希望使用 \b 来匹配单词边界,而不是考虑空格,这会将模式更改为:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 2012-04-09
    • 1970-01-01
    • 2021-05-23
    • 2019-08-26
    • 1970-01-01
    • 2011-12-13
    相关资源
    最近更新 更多