2017-07-04 1 views
0

Ich versuche, reguläre Ausdrücke in SystemVerilog zu verwenden. Die Zeichenklasse "\ d" (eine Ziffer) scheint nicht zu funktionieren, während andere Zeichenklassen wie "\ w", "\ s" gut funktionieren. Ich habe mit SVLIB und UVM versucht, dasselbe Verhalten.SystemVerilog & RegEx: " d" wird nicht als Zeichenklasse erkannt

Um zu reproduzieren habe ich den folgenden Code geschrieben. Der Code testet nur "1" gegen Regex "\ d" und "\ w" mit UVM und SVLIB.

module SandBox; 

import svlib_pkg::*; 
import uvm_pkg::*; 

initial 
begin 

Str myString; 
Regex regex; 

string testString; 
string reString; 

testString = "1"; 
reString = "\\d"; 

myString = Str::create(testString); 
regex = Regex::create(); 
regex.setRE(reString); 

$display("-------------------------------------"); 
$display("test string: %s", testString); 
$display("regex: %s", reString); 

if (regex.test(myString)) begin 

    $display("SVLIB Test passed!"); 

end 

if (!uvm_re_match(reString, testString)) begin 

    $display("UVM Test passed!"); 

end 

testString = "1"; 
reString = "\\w"; 

myString = Str::create(testString); 
regex = Regex::create(); 
regex.setRE(reString); 

$display("-------------------------------------"); 
$display("test string: %s", testString); 
$display("regex: %s", reString); 

if (regex.test(myString)) begin 

    $display("SVLIB Test passed!"); 

end 

if (!uvm_re_match(reString, testString)) begin 

    $display("UVM Test passed!"); 

end 

end 

endmodule 

Ich habe die folgende Ausgabe:

------------------------------------- 
test string: 1 
regex: \d 
------------------------------------- 
test string: 1 
regex: \w 
SVLIB Test passed! 
UVM Test passed! 

Was ist der Grund für dieses Verhalten? Das zugrunde liegende System? Etwas in der SV-Syntax?

+1

[0-9] + statt? –

+0

'\ d' ist nur ein konventionelles Symbol, es ist nicht zwingend erforderlich, dass eine Software es erkennt.Verwenden Sie einfach' [0-9] ' – horcrux

+0

Ist es das gleiche auf Ihrem Systeme oder ist es nur meins? – Andy

Antwort

1

Nach dem svlib Benutzerhandbuch und Programmierreferenz:

svlib verwendet die „erweiterte regulären Ausdruck“ Dialekt der der C-Bibliothek POSIX-kompatiblen regulären Ausdruck Subsystem, und Sie können alle Details finden wie man reguläre Ausdrücke in diesem Dialekt schreibt, indem man die Mann-Seite Mann 7 Regex oder irgendeine der zahlreichen on-line-regelmäßigen Ausdruckanleitungen konsultiert. Der Regex-Dialekt von svlib entspricht in fast allen Punkten dem von Unix/Linux beschriebenen Befehl egrep.

Der POSIX-Standard Ausdrücke (man 7 regexp), die wiederum definiert die verfügbaren Charakterklassen wie folgt:

Innerhalb eines Ausdrucks Klammer, der Name einer Zeichenklasse in „[eingeschlossen: "und":] "steht für die Liste aller zu dieser Klasse gehörenden Zeichen. Standard-Zeichenklassennamen sind:

alnum digit punct 
alpha graph space 
blank lower upper 
cntrl print xdigit 

Also, die Ziffern Zeichen Klasse angegeben werden muss, wie:

[[:digit:]] 

die kanonische Syntax.

Die \d, \w oder \s sind ein so Shorthand Character Classes genannt, die nicht durch den POSIX-Standard definiert, so dass ihre Verfügbarkeit über die Umsetzung Motor Regexp ab, die Sie verwenden.

Einige regexp Motoren wählen alle von ihnen, andere (zB sed oder grep zu implementieren, implementieren nur eine Teilmenge, ohne \d.

Die svlib Implementierung egrep kompatibel zu sein behauptet, und egrep nicht unterstützt \d