我试图在设备中返回并打印SIM卡的ICCID;SIM卡来自不同的供应商,因此长度不同( 19位或20位)。因此,我正在寻找一个正则表达式,该表达式将提取ICCID (其周围的非单词字符是不可知论的)。
考虑到ICCID被指定为以"89“开头的19-20位字符串,我只需选择:
(89\d{17,18})这是我测试过的最成功的模式(还有一些模式由于下面的原因而被拒绝)。
在我要从中提取它的字符串中,ICCID紧接着是一个回车,然后是一个行提要,但是一些针对用\r、\n甚至\b终止它的测试失败了(我正在使用的程序是构建在python上的内部程序,因此我怀疑它是用于regex的)。此外,简单地使用(\d{19,20})最终提取了20位ICCID的最后19位数字(作为第三位也是最后一次有效匹配)。按照同样的思路,我原则上排除了(\d{19,20})?,因为当它找到前19位数时,它就会结束。
所以我的问题是:应该使用我选择的模式,还是有更好的表达式(而不是使用非单词字符来设置字符串)来返回可变长度数字字符串中最长的子字符串?
发布于 2016-09-23 13:02:55
如果幕后的引擎实际上是Python,并且您需要提取的值周围可能有任何非数字字符,那么使用lookarounds来限制值周围的上下文:
(?<!\d)89\d{17,18}(?!\d)
^^^^^^^ ^^^^^^在匹配之前,(?<!\d)后置将需要一个数字的and,而(?!\d)负前瞻将要求在该值之后没有一个数字。
请参阅这个regex演示
发布于 2016-09-23 12:48:14
我会去
89\d{17,18}[^\d]这应该是18位数,但17位数也足够了。在此之后,将不再允许其他数字字符。
唯一的限制: ICCID之后必须有至少一个字符(根据您所描述的,这应该是可以的)。
请注意,任何带有"89“和17或18个数字字符的更长的数字序列也会匹配。
发布于 2016-09-23 13:12:44
(\d+)\D+ 看来它很快就能起作用了。(\d+ )将捕获20个数字。之后,\D+将与其他任何东西匹配。
https://stackoverflow.com/questions/39660961
复制相似问题