3

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

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

(89\d{17,18})

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

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

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

4

3 回答 3

1

我会去

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

这应该更喜欢 18 位数字,但 17 位也足够了。之后,将不再允许使用其他数字字符。

唯一的限制:ICCID 之后必须至少还有一个字符(根据您的描述应该可以)。

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

于 2016-09-23T12:48:14.377 回答
1

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

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

(?<!\d)后视需要在匹配之前没有数字,而负(?!\d)前瞻将需要在该值之后没有数字。

看到这个正则表达式演示

于 2016-09-23T13:02:55.297 回答
0
(\d+)\D+ 

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

于 2016-09-23T13:12:44.557 回答