在理解 Teradata 中的正则表达式逻辑时遇到一些困难:
有人可以解释为什么以下模式无法返回以下字符串吗?我可以采取哪些步骤来修复该模式?
输入字符串: “博卡拉顿很酷 - 2023 年 2 月 20 日”
当前模式:
.*(?=[\s\-]*[0-9]{4}\-[0-9]{2}\-[0-9]{2})
电流输出 “博卡拉顿很酷 - ”
所需输出: “博卡拉顿很酷”
对于上下文,这是在 Teradata SQL 中,我相信它使用 Perl 5 语法
我认为这是由于捕获组中和捕获组之前的贪婪字符发生冲突,但想知道是否有一种方法可以优先考虑捕获组的贪婪性。
作为参考,我试图返回任何中间有空格的字母数字字符,同时排除后面的空格/连字符。
这是因为
[\s\-]*
可以匹配这些字符的零次出现。前瞻之前的贪婪 .*
将尝试尽可能匹配,同时仍匹配其后的前瞻。因此,它将超过日期之前的 space-hyphen-space
,因为前瞻 atill 会在开始时不匹配它们。
使用非贪婪
.*?
应该可以解决这个问题。因此,需要 space-hyphen-space
(但如果这在所有值中不一致出现,则可能会导致其他问题。