2016-09-23 199 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 +之後會匹配其他任何東西。

相關問題