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

3
我会尽力为您翻译中文,以下是需要翻译的内容,涉及IT技术。本文主要讲述如何打印设备中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位数字时就结束。

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


这真的取决于您想解析的文件/文本的格式。我建议您在像https://regex101.com/#python这样的正则表达式测试器中“调整”您的表达式(使用“g”模式来模拟搜索)。 - Sergey Belash
我不明白为什么\d{19,20}只匹配了19个字符而不是20个 - 量词是贪婪的。 - Wiktor Stribiżew
@WiktorStribiżew 我怀疑它匹配了前19位数字,然后是所有20位数字,最后是最后19位数字。因为这是它得到的最后一个匹配,所以它返回了这个。 - Myles
如果您能提供更多细节,例如您尝试使用正则表达式匹配的文本示例,您得到的确切匹配内容,甚至是工具本身或其工作原理,那么我们可以提供更具体的帮助。 - Wiktor Stribiżew
3个回答

1

我会选择

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

这应该优先使用18位数字,但17位也可以。之后,不允许再输入其他数字字符。
唯一限制:ICCID后必须至少有一个字符(从您的描述中看来应该没问题)。
请注意,任何长于17或18个数字字符的序列,后面跟着“89”,也将匹配。

有很多不同的解决方案。但这个应该足够好用。 - freefall
请注意,Python 提供了 \D[^\d] - 如果您想允许 零个或多个字母,我建议使用 \D* - Jan

1
如果幕后的引擎确实是Python,并且您需要提取的值周围可以有任何非数字字符,请使用环视来限制值周围的上下文:
(?<!\d)89\d{17,18}(?!\d)
^^^^^^^         ^^^^^^

(?<!\d) 后顾断言要求匹配前面没有数字,(?!\d) 负向先行断言要求匹配后面没有数字。

查看 此正则表达式演示


0
(\d+)\D+ 

看起来这个很容易就能解决问题。(\d+)会捕获20个数字。\D+会匹配之后的任何其他内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接