2017-07-04 13 views
0

我試圖在SystemVerilog中使用正則表達式。字符類「\ d」(一個數字)似乎不起作用,而其他字符類(如「\ w」,「\ s」)正常工作。我嘗試了SVLIB和UVM,同樣的行爲。SystemVerilog&RegEx:「 d」不被識別爲字符類

重現我寫下面的代碼。代碼除了使用UVM和SVLIB針對正則表達式「\ d」和「\ w」測試「1」。

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 

我有以下的輸出:

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

什麼是這種現象的原因?底層系統? SV語法中的東西?

+1

[0-9] +而不是? –

+0

'\ d'只是一個傳統的符號,它不是軟件識別它的必需條件,只需使用'[0-9]' – horcrux

+0

就可以了系統還是隻是我的? – Andy

回答

1

按照svlib用戶指南和程序員參考

svlib使用C庫的POSIX兼容的正則表達式子系統, 的「擴展 正則表達式」方言,你可以找到全部細節如何通過查詢 man-page man 7正則表達式或任何衆多在線正則表達式教程來編寫此方言中的正則表達式。 svlib的 正則表達式在幾乎所有方面都與Unix/Linux命令egrep使用的相同。

的POSIX正則表達式標準(人7的regexp),反過來,定義了可用的字符類,如下所示:

在括號表達式,括在「[字符類的名稱: 「和」:]「代表屬於該類的所有字符的列表。標準的字符類名稱是:

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

因此,數字字符類有被指定爲:使用規範的語法

[[:digit:]] 

\d\w\s被所謂的Shorthand Character Classes,這不是由POSIX標準定義的,因此它們的可用性取決於您使用正則表達式 引擎實現。

一些正則表達式引擎選擇實現所有的人,其他人(如sedgrep,僅實現一個子集,但不包括\d

svlib實現自稱是egrep兼容,egrep不支持\d