Teradata正则表达式 - 零长度断言不支持重复?

时间:2018-01-25 19:45:15

标签: sql regex teradata

我需要在重复时使用后面的外观,但它看起来并不支持。有替代语法吗?

目的是匹配'第三'当它跟随'第一'和任意数量的' R'秒'

没有重复字符,这会编译,但显然无法匹配。

SELECT 'FirstRRRRRSecondThird' AS inputString,
       REGEXP_INSTR(inputString,'(?<=FirstRSecond)Third',1);

但是当我尝试添加重复时,我得到了指定的模式不是有效的模式。&#39;

SELECT 'FirstRRRRRSecondThird' AS inputString,
       REGEXP_INSTR(inputString,'(?<=FirstR+Second)Third',1);

另外,{1,M}失败

SELECT 'FirstRRRRRSecondThird' AS inputString,
       REGEXP_INSTR(inputString,'(?<=FirstR{1,}Second)Third',1);

这是一个非常普通的正则表达式,因此它似乎不太受支持。

1 个答案:

答案 0 :(得分:0)

看看:https://www.regular-expressions.info/lookaround.html (描述 lookahead lookbehind )并找到标题: 关于Lookbehind的重要说明

第二段以:

开头

许多正则表达式,包括Perl使用的那些,(...) 只允许固定长度字符串

所以你不能在任何外观中使用量词。

我认为,规避这种限制的方法是:

  • 使用“普通”匹配(而不是lookbehind),
  • 之后将你的原始模式放在一个捕获组中。

示例:

FirstR+SecondThird
  1. FirstR+Second匹配First,任意数量的R个字符 和Second
  2. 然后Third匹配Third
  3. 此正则表达式也符合您的意图:Third 在你的帖子中。

    顺便说一下:我想你在现实生活中发布了一个简化的正则表达式 而不是FirstSecondThird会更复杂 表达式。

    补充说明

    您可以删除REGEXP_INSTR(1)的第三个参数,因为它是默认值 价值只是 1 (寻找匹配,从第一个字符开始 源字符串)。