我目前面临一个Regex问题,显然我找不到答案。我的正则表达式嵌入在teradata SQL的形式:
REGEXP_SUBSTR(column, 'regex_pattern')
我想找到任何数字的第一次出现,除非它出现在字符串的末尾。
例如:
"YEL2X30"→"2">
"YEL19XYZ05"→"19">
"YELLOW05"→">
我尝试了'[0-9]+(?!$)/'
,但这总是返回一个空白字符串。
提前感谢!
因为我不熟悉teradata和所支持的sql功能,所以这里是在黑暗中拍摄的。但是,阅读关于REGEXP_SUBSTR()
函数的文档,似乎您可能希望使用第三和第四个可能的参数以及略有不同的正则表达式:
[0-9]+(?![0-9]|$)
含义:1+后面没有字符串结尾或其他数字的数字。
我相信下面的语法现在可以用来检索第一个匹配结果中任意数字的出现:REGEXP_SUBSTR(column, '[0-9]+(?![0-9]|$)', 1, 1)
第三个参数说明从源字符串中的哪个位置我们需要开始搜索,而第四个参数将从任何可能的多个匹配中返回第一个匹配(这就是我阅读文档的方式)。例如:abc123def456ghi789
将返回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
注意:我还注意到,省略第三和第四个参数并没有什么区别,因为它们在没有明确提及它们的情况下会默认为1。我在这里测试了一下
可能最简单的方法是查找后面跟着非数字的数字。然后保留所有的数字:
regexp_substr(regexp_substr(column, '[0-9]+[^0-9]'), '[0-9]+')