如果第一个数字没有出现在末尾,则正则表达式匹配第一个数字

Regex match first number if it does not appear at the end

我目前正面临一个正则表达式问题,显然我找不到答案。 我的 Regex 嵌入在以下形式的 teradata SQL 中:

REGEXP_SUBSTR(column, 'regex_pattern')

我想找到任何数字的第一次出现,除非它出现在字符串的末尾。

例如:

“YEL2X30”->“2”

“YEL19XYZ05”->“19”

“YELLOW05”->“”

我用 '[0-9]+(?!$)/' 尝试过,但是这个 returns 我总是一个空白字符串。

提前致谢!

由于我不熟悉 teradata 和支持的 SQL 功能,所以这里是在黑暗中拍摄的。但是,阅读有关 REGEXP_SUBSTR() 函数的文档,您似乎想要使用第三个和第四个可能的参数以及稍微不同的正则表达式:

[0-9]+(?![0-9]|$)

含义:1+ 个数字,后面没有跟字符串末尾或另一个数字。

我相信以下语法现在可以从匹配结果中检索任何数字的 第一次 出现:

REGEXP_SUBSTR(column, '[0-9]+(?![0-9]|$)', 1, 1)

第三个参数说明我们需要从源字符串中的哪个位置开始搜索,而第四个参数将 return 从任何可能的多个匹配项中找到第一个匹配项(我是这样阅读文档的)。例如:abc123def456ghi789 应该 return 123.


在网上闲逛 IDE 的结果是:

CREATE TABLE TBL (TST varchar(100));
INSERT INTO TBL values ('YEL2X30'), ('YEL19XYZ05'), ('YELLOW05'), ('abc123def456ghi789');
SELECT REGEXP_SUBSTR(TST, '[0-9]+(?![0-9]|$)', 1, 1) as 'RESULTS' FROM TBL;

结果:

RESULTS
2
19
NULL
123

注意: 我还注意到省略第 3 个和第 4 个参数没有任何区别,因为它们将默认返回 1 而不明确提到他们。我在 here.

上测试了这个

可能最简单的方法是查找数字后接非数字。然后保留所有数字:

regexp_substr(regexp_substr(column, '[0-9]+[^0-9]'), '[0-9]+')