2014-10-31 72 views
0

我需要匹配所有形式的文字在Swift(特別是整數)語言regular expression圖案(包括二進制八進制十進制十六進制文本) 。正則表達式模式匹配所有形式的整數常量

到目前爲止我

/-?\d+(\.\d+)?/ 

我認爲比賽的整數和小數。但我不確定如何爲二進制,八進制和十六進制編寫它。我只需要一個匹配所有模式的模式。

對於十六進制,/[0-9a-fA-F]+/模式將起作用。但我想要一個匹配所有整數文字的模式,包括二進制,八進制,十進制和十六進制文字。

+0

'但是我不知道怎麼寫呢二進制,八進制和hexadecimal.'發佈一些例子複製此。 – 2014-10-31 03:14:42

+0

''(?: 0 [xX] [0-9a-fA-F] + | - ?\ d +(?:\。\ d +)?)$'適用於除八進制外的所有函數。 – 2014-10-31 03:28:25

+0

'/ - ?\ d +(。\ d +)?/'這會匹配浮點數。 – nhahtdh 2014-10-31 03:30:50

回答

1
use Test::Simple; 

my $pat = qr/^(?: 
    [0-9][0-9_]* | 
    0b[01][01_]* | 
    0o[0-7][0-7_]* | 
    0x[0-9a-fA-F][0-9a-fA-F_]* 
)$/x; 

my @oks = (
    "1", 
    "01", 
    "1__", 
    "0b101", 
    "0b0101__101", 
    "0o2242", 
    "0o224__2_", 
    "0x2df1", 
    "0x2D_f1_", 
); 

my @ngs = (
    "1.0", 
    "_1", 
    "1e23", 
    "1_e23_", 
    "0b12", 
    "0o12f", 
    "0o12e1", 
    "0_o2", 
    "0x01d1p1", 
    "0O1", 
    "0X1", 
    "0B1", 
); 

for my $val (@oks) { 
    ok($val =~ $pat, "match: $val"); 
} 
for my $val (@ngs) { 
    ok(($val !~ $pat), "reject: $val"); 
} 

因爲一元運算符-不是整數字面量的一部分,所以我沒有包含它。見this documentthis

請注意,這是爲整數只,不包括浮動類型。

如果你希望所有的數字類型,該模式將是:

my $pattern = qr/^(?: 
    [0-9][0-9_]* (?: \.[0-9][0-9_]*)? (?: [eE][\+\-]?[0-9][0-9_]*)? | 
    0b[01][01_]* | 
    0o[0-7][0-7_]* | 
    0x[0-9a-fA-F][0-9a-fA-F_]* (?: \.[0-9a-fA-F][0-9a-fA-F_][pP][\+\-]?[0-9][0-9_]* | [pP][\+\-]?[0-9][0-9_]*)? 
)$/x;