我需要一个regular expression模式,该模式匹配Swift(特别是整数)语言中的所有文字形式(包括二进制,八进制, 十进制和十六进制文字)。
到目前为止,我得到了
/-?\d+(\.\d+)?/
我认为匹配整数和小数。但我不知道如何为二进制,八进制和十六进制编写它。我只需要一个匹配所有模式的模式。
对于十六进制,/[0-9a-fA-F]+/
模式可行。但我想要一个匹配所有整数文字的模式,包括二进制,八进制,十进制和十六进制文字。
答案 0 :(得分: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 document或this。
请注意,这仅适用于整数,不包括 float 类型。
如果您想要所有数字类型,则模式为:
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;