2016-09-23 429 views
2

我试图返回并在设备中打印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位时完成。

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

+0

这实际上取决于你想要解析的文件/文本的格式。我建议你在像https://regex101.com/#python这样的正规表达式测试器中“调整”你的表达式(使用“g”模式来模拟搜索) –

+0

我不明白为什么只有'\ d {19,20}'匹配20个字符中的19个 - 量词是贪婪的。 –

+0

@WiktorStribiżew我怀疑它匹配了前19位数字,然后是所有20位数字,然后是最后19位数字。因为这是最后一场比赛,这是它返回的那场比赛。 – Myles

回答

1

如果幕后的发动机是真正的Python,并有可能在你身边需要提取值的任何非数字字符,使用lookarounds限制各地值上下文:

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

(?<!\d)在比赛之前需要缺少一位数字,并且(?!\d)负值预测将需要在该值之后没有数字。

this regex demo

1

我会去

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

这应该比较喜欢18位,但17也就够了。之后,将不允许其他数字字符。

仅限制:在ICCID之后必须至少有一个字符(这应该与您所描述的相符)。

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

+0

有这么多不同的解决方案。但是,这应该足够好。 – freefall

+0

请注意,'Python'提供'\ D'以及'[^ \ d]' - 如果你想允许**零个或多个字母**,我会去'\ D *'。 – Jan

0
(\d+)\D+ 

似乎将容易做的伎俩。 (\ d +)会捕获20个数字。 \ D +之后会匹配其他任何东西。

相关问题