2017-06-27 6 views
1

Ich bin ein neuer Benutzer von svlib-Paket in Systemverilog-Umgebung. Ich habe folgenden Beispieltext, {'PARAMATER': 'lollg_1', 'SPEC_ID': '1G3HSB_1'} und ich möchte Regex verwenden, um 1G3HSB aus diesem Text zu extrahieren.Regex-Verarbeitung in Systemverilog mit svlib

Aus diesem Grund benutze ich das folgende Code-Snippet, aber ich bekomme die ganze Zeile statt nur die Informationen.

wordsRe = regex_match(words[i], "\'SPEC_ID\': \'(.*?)\'"); 
$display("This is the output of Regex: %s", wordsRe.getStrContents()) 

Kann mir jemand sagen, was schief läuft? Die Ausgabe erhalte ich: { 'Paramater': 'lollg_1', 'SPEC_ID': '1G3HSB_1'} Und ich will bekommen: 1G3HSB_1

+0

Gibt es Unterlagen dazu? –

+0

@ WiktorStribiżew: Ich hatte die gleiche Frage und ich musste stfw finden: http://www.verilab.com/resources/svlib/. Dies ist nicht Teil der IEEEStd for SystemVerilog. – toolic

+0

Es sieht so aus, als müssten Sie 'getMatchString (1);' und ich denke, Sie müssen '. *?' Durch '[^ '] *' ' –

Antwort

1

Es scheint, dass Sie die Inhalte erhalten müssen die erste Erfassungsgruppe mit . Außerdem müssen Sie einen gierigen Quantor verwenden (Faulen nicht konform POSIX) und eine negierte Ausdruck in eckigen Klammern - [^']* statt .*?:

wordsRe = regex_match(words[i], "\'SPEC_ID\': \'([^\']*)\'"); 
$display("This is the output of Regex: %s", wordsRe.getMatchString(1)) 

finden Sie im Benutzerhandbuch Details:

getMatchString(m) ist immer entspricht genau den Bereich Methode auf dem Str Objekt enthält die Zeichenfolge aufrufen, die gesucht wurde:

range(getMatchStart(m), getMatchLength(m)) 
+0

Vielen Dank Wiktor. Es hat das Problem gelöst. – Imran

+0

Habe es einfach getan. : D BTW Wiktor, könntest du erklären warum. *? würde nicht funktionieren und [^ '] * würde? Danke im Voraus. – Imran

+0

POSIX regex unterstützt keine Lazer-Quantoren. Um so wenig Zeichen wie möglich zwischen zwei Zeichen zu finden, müssen Sie negierte Klammerausdrücke/Zeichenklassen verwenden. –

Verwandte Themen