【问题标题】:Regular Expression in teradatateradata 中的正则表达式
【发布时间】:2019-03-04 09:45:45
【问题描述】:

我需要在Teradata 中使用正则表达式从列中搜索几个模式。 下面提到了一个例子:

SELECT 
  REGEXP_SUBSTR(
    REGEXP_SUBSTR('1-2-3','([0-9] *- *[0-9] *- *[0-9])',1, 1, 'i'),
    '([0-9] *- *[0-9] *- *[0-9])',
    1, 1, 'i'
  ) AS Tmp,
  REGEXP_SUBSTR(
    tmp,
    '(^[0-9])',1,1,'i') || '-' || REGEXP_SUBSTR(tmp,'([0-9]$)',
    1, 1, 'i'
  ) AS final_exp
;

在上面的表达式中,我从“1-2-3”这样的模式中提取“1-3”。现在模式可以是:1-2-3-4-5 或 1-2,3 或 1&2-3 或 1-2,3 &4。 有什么方法可以概括正则表达式中的搜索模式,例如 [-,&]* 只会按顺序搜索此字符的出现,但这些字符可以在数据中以任何顺序出现。 下面提到的几个例子,需要在表达式中使用单个模式搜索来获取所有想要的结果集。

Column name           ==>  Result  
abc 1-2+3- 4          ==> 1-4  
def 10,12 & 13        ==> 10-13  
ijk 1,2,3, and 4 lmn  ==> 1-4  
abc1-2 & 3 def        ==> 1-3  
ikl 11 &12 -13        ==> 11-13   
oAy$ 7-8 and 9        ==> 7-9  

【问题讨论】:

  • 您能解释一下您要应用的逻辑并添加一些示例数据和预期结果吗?
  • 要遵循的逻辑是从模式中切出最小和最大数字并消除其中的特殊字符,然后将两个数字用'-'隔开
  • leastmax 还是 firstlastabc 3-4+2- 1 -> '3-1?如果没有或只有一个弹头怎么办?
  • 感谢您的回复。它应该是用 '-' 分隔的第一个和最后一个数字,但第一个和最后一个数字应该紧跟一个特定的字符串(比如说 abc)。例如:“abc 1-2 &3,4 def 1-3”,这应该搜索字符串“abc”之后的第一个和最后一个数字,结果应该是“1-4”。使用以下逻辑,它可以导致 1-3。万一搜索关键字后面有一个数字(比方说),只需要捕获单个数字。例如:“abc 11 def 1-3”应该是“11”。

标签: teradata


【解决方案1】:
RegExp_Substr(col, '(\d+)',1, 1, 'c') || '-' ||
RegExp_Substr(col, '(\d+)(?!.*\d)',1, 1, 'c')

(\d+)  = first number
(\d+)(?!.*\d) = last number (a number not followed by another number)

也不需要那些可选参数,因为它仍然使用默认值:

RegExp_Substr(col, '(\d+)') || '-' ||
RegExp_Substr(col, '(\d+)(?!.*\d)')

【讨论】:

    猜你喜欢
    • 2020-02-25
    • 2018-08-02
    • 2016-10-08
    • 2021-06-09
    • 2017-08-09
    • 2018-01-30
    • 2021-06-09
    • 2020-01-14
    • 2023-03-12
    相关资源
    最近更新 更多