2016-09-23 5 views
2

Ich versuche, die ICCID einer SIM-Karte in einem Gerät zurückzugeben und zu drucken; Die SIM-Karten sind von verschiedenen Anbietern und daher unterschiedlich lang (entweder 19 oder 20 Ziffern). Als Ergebnis suche ich nach einem regulären Ausdruck, der die ICCID extrahiert (in einer Weise, die für Nicht-Wort-Zeichen, die sie unmittelbar umgeben, agnostisch ist).Extrahieren von ICCID aus einer Zeichenfolge mit Regex

(89\d{17,18}) 

Dies das erfolgreichste Muster war, dass ich (zusammen getestet hatte:

Da ein ICCID als mit „89“ string beginnend 19-20 Ziffer angegeben wird, habe ich einfach für gegangen mit einigen Mustern aus folgenden Gründen abgelehnt).

In der Zeichenfolge, die ich von der Gewinnung bin, wird die ICCID sofort von einem Wagenrücklauf und dann einen Zeilenvorschub, aber einige Tests gegen endet es mit \r, \n oder sogar \b fehlgeschlagen gefolgt arbeiten (das Programm das ich benutze ist ein internes, das auf Python aufgebaut ist, also vermute ich, dass es das für Regex ist). Die einfache Verwendung von endete mit dem Extrahieren der letzten 19 Ziffern einer 20-stelligen ICCID (als dritte und letzte gültige Übereinstimmung). In der gleichen Weise, ich ausgeschlossen (\d{19,20})? im Prinzip, wie ich denke, dass zu beenden, wenn es die ersten 19 Ziffern findet.

Also meine Frage ist: Sollte ich das Muster, das ich gewählt habe, verwenden, oder gibt es einen besseren Ausdruck (keine Nicht-Wort-Zeichen zum Rahmen der Zeichenfolge), die längste Teilzeichenfolge einer variablen Länge zurückgibt Ziffernfolge?

+0

Es hängt wirklich vom Format der Datei/des Textes ab, den Sie analysieren möchten. Ich rate Ihnen, Ihren Ausdruck in einem Regexp-Tester wie https://regex101.com/#python zu "tunen" (verwenden Sie den "g" -Modus, um die Suche zu simulieren) –

+0

Ich verstehe nicht, warum '\ d {19,20}' nur passt zu 19 von 20 Zeichen - der Quantifizierer ist gierig. –

+0

@ WiktorStribiżew Ich vermute, dass es die ersten 19 Ziffern gefolgt, dann alle 20 Ziffern, dann die letzten 19 Ziffern. Da es das letzte Match ist, das es hat, ist es das, das es zurückbringt. – Myles

Antwort

1

Wenn der Motor hinter den Kulissen wirklich Python ist, und es können beliebige Nicht-Ziffern Zeichen sein um den Wert, den Sie extrahieren müssen, verwenden lookarounds um die Werte um den Kontext zu beschränken:

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

Die (?<!\d) Loobehind erfordert das Fehlen einer Ziffer vor dem Spiel und (?!\d) negative Lookahead erfordert das Fehlen einer Ziffer nach diesem Wert.

Siehe this regex demo

1

würde ich für

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

Diese 18 Stellen bevorzugen sollte, aber 17 würde auch genügen. Danach wären keine weiteren numerischen Zeichen mehr erlaubt.

Einzige Einschränkung: Nach der ICCID muss mindestens ein weiteres Zeichen vorhanden sein (was in Ordnung sein sollte von dem, was Sie beschrieben haben).

Beachten Sie, dass eine längere Zahlenfolge mit "89" gefolgt von 17 oder 18 numerischen Zeichen ebenfalls übereinstimmen würde.

+0

Es gibt so viele verschiedene Lösungen dafür. Aber das sollte gut genug funktionieren. – freefall

+0

Beachten Sie, dass "Python" '\ D' sowie' [^ \ d] 'anbietet - wenn Sie ** null oder mehr Buchstaben ** erlauben wollen, würde ich nach' \ D * 'gehen. – Jan

0
(\d+)\D+ 

scheint, wie es den Trick leicht tun würde. (\ d +) würde 20 Zahlen erfassen. \ D + würde danach alles andere zusammenbringen.

Verwandte Themen