Sql Teradata正则表达式,0或1个空格
在Teradata中,我正在寻找一种正则表达式模式,它允许我找到一些数字的模式,然后是一个空格,或者可能没有空格,然后是“SF”。在以下两种情况下,它都应返回7:Sql Teradata正则表达式,0或1个空格,sql,regex,teradata,Sql,Regex,Teradata,在Teradata中,我正在寻找一种正则表达式模式,它允许我找到一些数字的模式,然后是一个空格,或者可能没有空格,然后是“SF”。在以下两种情况下,它都应返回7: SELECT REGEXP_INSTR('12345 1000SF', pattern), REGEXP_INSTR('12345 1000 SF', pattern) 或者,如果有更简单的方法,我的实际目标是在这两种情况下提取1000,可能使用REGEXP\u SUBSTR。如果您需要更多详细信息,请参见下文 我有一个专栏,其中包
SELECT
REGEXP_INSTR('12345 1000SF', pattern),
REGEXP_INSTR('12345 1000 SF', pattern)
或者,如果有更简单的方法,我的实际目标是在这两种情况下提取1000,可能使用REGEXP\u SUBSTR。如果您需要更多详细信息,请参见下文
我有一个专栏,其中包含自由文本,我想提取平方英尺。但是,在某些情况下,数字和“SF”之间有一个空格,在某些情况下没有:
'other stuff 1000 SF'
'other stuff 1000SF'
我试图使用REGEXP_INSTR函数来查找起始位置。通过谷歌,我找到了第一个要成为的模式
'([0-9])+ SF'
当我尝试第二种模式时,我会尝试
'([0-9])+SF'
我得到了错误
SELECT Failed. [2662] SUBSTR: string subscript out of bounds
我也发现了一个类似问题的答案,但它们不适用于Teradata。例如,我不认为你可以使用?在Teradata中。我会将其模式设置为:
\b(\d+)\s*[Ss][Ff]\b
\b # word boundary
(\d+) # 1 or more digits (captured)
\s* # 0 or more white-space characters
[Ss] # character class
[Ff] # character class
\b # word boundary
错误消息表示您正在使用
SUBSTR
,而不是REGEXP\u SUBSTR
试试这个:
RegExp_Substr(col, '[0-9]*(?= {0,1}SF)')
查找多个数字,后跟一个可选空白,后跟
SF
,然后提取这些数字。尝试'[0-9]+SF'
。将字符类放入一个组中并量化该组而不是字符类原子是没有意义的。如果不能使用?
,则只需将一种模式或另一种模式与类似[0-9]+SF |[0-9]+SF
的内容进行匹配。好的,尝试使用此模式-'[0-9][0-9]*?SF code>,以匹配这两种情况。或者'[0-9][0-9]*(|)SF'
来避免?
的问题。好的,我也建议'[0-9][0-9]*(|)SF'
。是什么让REGEXP|u SUBSTR函数只返回这里的数字?我在网上查看文档,没有这样的例子,它可以找到一个模式并获取模式的一部分。这是非常强大的。这正是regexp\u substr
所做的-基于regex获取字符串的一部分。(?=…)
是一种所谓的前瞻,即检查模式而不将其添加到结果中。顺便说一句,Teradata支持“Perl兼容正则表达式”(PCRE)语法,没有太多的docu,但有很多在线资源。后面有介绍吗?因为,我现在想做一些不同的事情,在那里我得到一个模式的结束部分。我已经尝试过在模式的前面部分使用(?=),但它不起作用。@Graphth:(?非常感谢您的回答。它也很有帮助。