使用正则表达式从字符串中提取ICCID
问题描述:
我试图返回并在设备中打印SIM卡的ICCID; SIM卡来自不同的供应商,因此具有不同的长度(19或20位数字)。因此,我正在寻找一个能够提取ICCID的正则表达式(以不可知的方式直接围绕它的非单词字符)。使用正则表达式从字符串中提取ICCID
假设一个ICCID被指定为19-20位是以“89”,我只是走了:
(89\d{17,18})
沿着这是我已经测试了最成功的模式(由于下面的原因拒绝了一些模式)。
在我是从提取它的字符串时,ICCID后面紧跟着一个回车,然后换行,而是针对与\r
终止它的一些测试,\n
,甚至\b
未能奏效(程序我使用的是一个内置的python,所以我怀疑这就是它用于正则表达式)。另外,简单地使用(\d{19,20})
最终提取20位ICCID的最后19位数(作为第三次和最后一次有效匹配)。基于同样的原则,我原则上排除了(\d{19,20})?
,因为我期望在找到前19位时完成。
所以我的问题是:我应该使用我选择的模式,还是有一个更好的表达式(不使用非单词字符来构造字符串),它将返回可变长度的最长子字符串数字串?
答
如果幕后的发动机是真正的Python,并有可能在你身边需要提取值的任何非数字字符,使用lookarounds限制各地值上下文:
(?<!\d)89\d{17,18}(?!\d)
^^^^^^^ ^^^^^^
的(?<!\d)
在比赛之前需要缺少一位数字,并且(?!\d)
负值预测将需要在该值之后没有数字。
答
(\d+)\D+
似乎将容易做的伎俩。 (\ d +)会捕获20个数字。 \ D +之后会匹配其他任何东西。
这实际上取决于你想要解析的文件/文本的格式。我建议你在像https://regex101.com/#python这样的正规表达式测试器中“调整”你的表达式(使用“g”模式来模拟搜索) –
我不明白为什么只有'\ d {19,20}'匹配20个字符中的19个 - 量词是贪婪的。 –
@WiktorStribiżew我怀疑它匹配了前19位数字,然后是所有20位数字,然后是最后19位数字。因为这是最后一场比赛,这是它返回的那场比赛。 – Myles