匹配数字范围后跟1-3个字母

时间:2018-03-16 12:36:45

标签: regex oracle business-intelligence

我必须匹配1到33689之间的数字,然后它应该是A,AB或ABC。

我现在有%1,^[0-9\.]{0,5}.*[A-z]+$,我正在使用Oracle商务智能。因此,它不是直接的数据库查询。使用MySQL我用^[a-zA-Z0-9_]{1,5}([^[:digit:]]|$)做了,我已经用

做了一个订单
regexp_substr(replace(number,'.',''),'^(\d+)',1,1,NULL,1)

并且效果很好。

但我不能在Oracle商业智能中以1对1的比例。

3 个答案:

答案 0 :(得分:1)

您的问题似乎与Oracle商业智能(OBIEE)相关,而不是正则表达式。使用^[0-9]{1-5}[A-Z]{1-3}$实现1-5位数后跟1-3个字母的基本正则表达式。如果您想避免前缀零和match a specific numeric range,则以下内容与0-33689范围匹配:

0|[1-9][0-9]{0-3}|[12][0-9]{4}|3[0-2][0-9]{3}|33[0-5][0-9]{2}|336[0-7][0-9]|3368[0-9]

1-3'A'非常简单A{1-3}

正如博客文章Regular Expressions in OBIEE所暗示的那样,

  

这里唯一的问题是OBIEE不支持其SQL语言中的正则表达式,因此我必须使用EVALAUTE命令将Oracle的正则表达式语法传递回数据库。

它继续举例说明:

Evaluate('regexp_substr(%1,''regex_goes_here''), "FIELD_NAME")'

由于您没有提供执行此正则表达式的上下文,因此,如果 Oracle的正则表达式语法缺少某些正则表达式,那么您是否未能描述正确的模式则完全不清楚你正在使用的功能(我不能声称知道这种方言),但是,例如所有正则表达式引擎都不支持命名字符组(\d)和字符范围({1-3})。

也许您的问题在于调用Evaluateregexp_substr

答案 1 :(得分:0)

替代解决方案:

匹配任何后跟A AA或AAA的5位数

/^[0-9]{5}(A?){3}$/

并将找到的匹配解析为整数

Pseudocode:
var tmp = parse_to_int(match)

将结果与33689进行比较

Pseudocode:
if(tmp <= 33689)
    {
        //proceed as you wish
    }

答案 2 :(得分:0)