尝试从文本字段中提取数字

时间:2019-06-10 01:52:15

标签: regex regexp-substr snowflake

我输入了13或17位数字ID的不同文本字段。需要从此字段中提取该ID

 regexp_substr(TXT,'CTRL ACDV\\s+(\\d+)',1,1,'ie')..

Txt可以像这样

 SUPPRESSED AND FORWARDING CTRL{ACDV 36608732875895776 } {DRID 12345

   SUPPRESSED AND FORWARDING CTRL 9809770899005 TO FRAUD DUE TO ID TH

   SUPPRESSED AND FORWARDING CTRL ACDV 987878829039161097 .DRID 87569
regexp_substr(TXT,'CTRL ACDV\\s+(\\d+)',1,1,'ie')..

需要获得

36608732875895776
9809770899005 
987878829039161097

3 个答案:

答案 0 :(得分:1)

如果您可以假设数字是最小长度,那么这适用于您的3个示例:

SELECT regexp_substr('SUPPRESSED AND FORWARDING CTRL{ACDV 36608732875895776 } {DRID 12345',
                      '(\\d{13,})', 1,1, 'e');

SELECT regexp_substr('SUPPRESSED AND FORWARDING CTRL 9809770899005 TO FRAUD DUE TO ID TH',
                      '(\\d{13,})', 1,1, 'e');

SELECT regexp_substr('SUPPRESSED AND FORWARDING CTRL ACDV 987878829039161097 .DRID 87569',
                      '(\\d{13,})', 1,1, 'e');

答案 1 :(得分:0)

如果唯一的大数字是ID,那么这是最短和最快的:

\d{13,17}

测试here


请注意,第三个ID(987878829039161097)实际上是18位数字。

因此,如果最小长度为13,则可能要使用:

\d{13,}

或者,如果要删除长ID之外的所有内容,则可以搜索正则表达式:

([^\d]+|\d{,12})

,然后将其替换为\ n(=新行)或您想要的任何内容(例如空格)。

测试here

如果分两步进行替换,则可能会得到更好的结果。首先是:

[^\d]+

(非数字)

,然后针对:

\s\d{1,12}(\s|$)

(对于少于13位数字的数字)

答案 2 :(得分:0)

您可以使用捕获组并使用(来自docsclass SetMeta(models.Model): ... @property def order(self): return self.set.items.count()

请注意,最后一个数字是18位而不是17位。

e parameter to return only the part of the string that matches the first sub-expression in the pattern

说明

  • \bCTRL\D+(\d{13,18}) 匹配单词边界和CTRL
  • \bCTRL匹配1次以上而不是数字
  • \D+捕获1组1匹配的13-18位数字

Regex demo

另一种选择是使用(\d{13,18})匹配13个或更多数字

docs指出模式在两端隐式锚定,在这种情况下,您可以使用:

\d{13,}

Regex demo