使用正则表达式从字符串中提取 ICCID

Extracting ICCID from a string using regex

我正在尝试 return 并在设备中打印 SIM 卡的 ICCID; SIM 卡来自不同的供应商,因此长度不同(19 位或 20 位)。因此,我正在寻找一个将提取 ICCID 的正则表达式(以一种与它周围的非单词字符不可知的方式)。

鉴于 ICCID 被指定为以“89”开头的 19-20 位数字字符串,我简单地选择了:

(89\d{17,18})

这是我测试过的最成功的模式(以及由于以下原因而被拒绝的一些模式)。

在我从中提取它的字符串中,ICCID 后面紧跟着一个回车符 return,然后是一个换行符,但是一些测试反对用 \r\n,甚至 \b 都无法工作(我正在使用的程序是基于 python 构建的内部程序,所以我怀疑这就是它用于正则表达式的)。此外,只需使用 (\d{19,20}) 即可提取 20 位 ICCID 的最后 19 位数字(作为第三个也是最后一个有效匹配项)。同样,我原则上排除了 (\d{19,20})?,因为我希望它在找到前 19 位数字时完成。

所以我的问题是:我应该使用我选择的模式,还是有更好的表达方式(不使用非单词字符来构建字符串) return 可变长度数字串的最长子串?

我会去

89\d{17,18}[^\d]

最好是 18 位数字,但 17 位也足够了。之后,将不再允许使用其他数字字符。

唯一的限制:ICCID后面至少要多一个字符(根据你的描述应该没问题)。

请注意,包含“89”后跟 17 或 18 个数字字符的任何更长的数字序列也将匹配。

如果幕后引擎确实是 Python,并且您需要提取的值周围可以有任何非数字字符,请使用环视来限制值周围的上下文:

(?<!\d)89\d{17,18}(?!\d)
^^^^^^^         ^^^^^^

(?<!\d) loobehind 将要求在匹配前缺少数字,(?!\d) 否定前瞻将要求在该值之后缺少数字。

this regex demo

(\d+)\D+ 

看起来它很容易做到这一点。 (\d+ ) 会捕获 20 个数字。 \D+ 之后会匹配任何其他内容。