我试图返回并在设备中打印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位数时完成。
所以我的问题是:我应该使用我选择过的模式,还是有更好的表达方式(不使用非单词字符来构建字符串)将返回最长的模式可变长度数字字符串的子字符串?
答案 0 :(得分:1)
我去了
89\d{17,18}[^\d]
这应该更喜欢18位,但17也足够了。之后,不再允许其他数字字符。
唯一的限制:在ICCID之后必须至少再增加一个字符(这应该与你所描述的一样)。
请注意,任何更长的数字序列都会带有" 89"其次是17或18个数字字符也会匹配。
答案 1 :(得分:1)
如果幕后引擎真的是Python,并且你需要提取的值周围可能有任何非数字字符,请使用lookarounds来限制值的上下文:
Baz
<add key="Umbraco.ModelsBuilder.Enable" value="true" />
<add key="Umbraco.ModelsBuilder.ModelsMode" value="Dll" />
loobehind将需要在比赛前缺少一个数字,(?<!\d)89\d{17,18}(?!\d)
^^^^^^^ ^^^^^^
否定前瞻将要求在该值之后缺少数字。
答案 2 :(得分:0)
(\d+)\D+
似乎很容易就能做到这一点。 (\ d +)将捕获20个数字。 \ D +之后会匹配其他任何东西。