我有这个sql表达式:
regexp_matches(view_definition,'(ms_sub_[0-9]+)(.*group by)','ig')
试图在'ms_sub_'和'group by'之间返回文本。它将所有文本返回到最后一次出现的'group by',但我只希望文本到下一次出现的group by。我试图让'分组'懒惰,但无法弄清楚如何做到这一点。
答案 0 :(得分:0)
你需要摆脱第一个贪心量词,然后你可以使用一个懒惰的*?
量词与点:
regexp_matches(view_definition,'ms_sub_[0-9].*?group by','ig')
请参阅online demo
当您使用[0-9]+
时,将整个表达式贪婪设置为“贪婪”,稍后使用的.*?
被视为贪婪,{{1} ,模式。您也可以使用.*
来获得相同的结果。唯一的区别是您的捕获组可能包含的内容,但在这种情况下,您似乎只需要整个匹配值。
如果您关心捕获的值,可以使用
\d+?
其中(ms_sub_\d+?(?!\d))(.*?group by)
预测将确保(?!\d)
匹配\d+?
之后的所有连续数字,同时仍然使用延迟量词。
如果您希望ms_sub_
与ms_sub_<digits>
之间至少有1位非数字字符,则可以使用group by
(ms_sub_\d+?)(\D.*?group by)
匹配除数字以外的任何字符。