我输入了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
答案 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)
您可以使用捕获组并使用(来自docs的class 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位数字另一种选择是使用(\d{13,18})
匹配13个或更多数字
docs指出模式在两端隐式锚定,在这种情况下,您可以使用:
\d{13,}