匹配所有形式的整数文字的正则表达式模式

时间:2014-10-31 03:13:36

标签: regex perl swift

我需要一个regular expression模式,该模式匹配Swift(特别是整数)语言中的所有文字形式(包括二进制八进制十进制十六进制文字)。

到目前为止,我得到了

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

我认为匹配整数和小数。但我不知道如何为二进制,八进制和十六进制编写它。我只需要一个匹配所有模式的模式。

对于十六进制,/[0-9a-fA-F]+/模式可行。但我想要一个匹配所有整数文字的模式,包括二进制,八进制,十进制和十六进制文字。

1 个答案:

答案 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 documentthis

请注意,这仅适用于整数,不包括 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;