REGEX 贪婪匹配问题 - SQL Teradata

问题描述 投票:0回答:1

在理解 Teradata 中的正则表达式逻辑时遇到一些困难:

有人可以解释为什么以下模式无法返回以下字符串吗?我可以采取哪些步骤来修复该模式?

输入字符串: “博卡拉顿很酷 - 2023 年 2 月 20 日”

当前模式:

.*(?=[\s\-]*[0-9]{4}\-[0-9]{2}\-[0-9]{2})

电流输出 “博卡拉顿很酷 - ”

所需输出: “博卡拉顿很酷”

对于上下文,这是在 Teradata SQL 中,我相信它使用 Perl 5 语法

我认为这是由于捕获组中和捕获组之前的贪婪字符发生冲突,但想知道是否有一种方法可以优先考虑捕获组的贪婪性。

作为参考,我试图返回任何中间有空格的字母数字字符,同时排除后面的空格/连字符。

sql regex teradata regex-lookarounds
1个回答
0
投票

这是因为

[\s\-]*
可以匹配这些字符的零次出现。前瞻之前的贪婪
.*
将尝试尽可能匹配,同时仍匹配其后的前瞻。因此,它将超过日期之前的
space-hyphen-space
,因为前瞻 atill 会在开始时不匹配它们。

使用非贪婪

.*?
应该可以解决这个问题。因此,需要
space-hyphen-space
(但如果这在所有值中不一致出现,则可能会导致其他问题。

© www.soinside.com 2019 - 2024. All rights reserved.