需要正则表达式调整

时间:2014-12-22 17:23:19

标签: regex

我很感激Perl中正则表达式的一些快速帮助。我希望正则表达式专家可以快速发现我做错了什么。

我正在尝试匹配以下形式的字符串并拒绝其他任何内容:

1.2
1.2_EB4
1.2_FB4
1.2.3
1.2.3_EB4
1.2.3_FB4

“1”,“2”,“3”和“4”可以是任何非负整数,但“EB”,“FB”,下划线和点是固定的。

这是我到目前为止所拥有的。 (不要担心小时/分钟/秒,而且是的,是的,我正在丢弃“1”并重新排序“2”,“3”和“4”。)

my $hours = 0;
my $minutes = 0;
my $seconds = 0;

#                          [ws]  123   .   456  [ .  789  ]  [ _xB      234 ]
#                          --- ------ -- ------  -- ------    ------- ------
my ($found) = ($input =~ /^\s*([0-9]+)\.([0-9]+)(\.([0-9]+))?(\_[EF]B([0-9]+))?/);

if ($found)
{
    $hours = $2;
    $minutes = $6;
    $seconds = $4 if ($4);

    $hours   = 0 if ($hours   eq "");
    $minutes = 0 if ($minutes eq "");
    $seconds = 0 if ($seconds eq "");
}

以下是我获得某些输入的内容:

+---------+--------+-------+
|  Input  |Expected| Actual|
|---------|--------|-------|
|1        |  false | false |
|1.       |  false | false |
|1.2      |  2:0:0 | 2:0:0 |
|1.2.     |  false | 2:0:0 |
|1.2.3    |  2:0:3 | 2:0:3 |
|1.2_     |  false | 2:0:0 |
|1.2_E    |  false | 2:0:0 |
|1.2_FB   |  false | 2:0:0 |
|1.2_EB4  |  2:4:0 | 2:4:0 |
|1.2_GB4  |  false | 2:0:0 |
|1.2.3_   |  false | 2:0:3 |
|1.2.3_E  |  false | 2:0:3 |
|1.2.3_FB4|  2:4:3 | 2:4:3 |
|1.2.3_GB4|  false | 2:0:3 |
+---------+--------+-------+

我感谢任何人都可以提供帮助。

感谢。

2 个答案:

答案 0 :(得分:2)

在正则表达式的末尾粘贴$,它应该有效:

/^\s*([0-9]+)\.([0-9]+)(\.([0-9]+))?(_[EF]B([0-9]+))?$/

您可以找到在线解释和演示here

如果没有$锚点,则正则表达式将匹配1.21.2.1.2_1.2_E,{{1.2_FB部分1}},1.2_GB41.2.3_1.2.3_E然后退出而不尝试匹配更多内容。

如果您不需要捕获捕获组中的数字,可以稍微简化一下:

1.2.3_GB4

https://regex101.com/r/lM3bD7/2

答案 1 :(得分:1)

你可以使用锚点并简化你的正则表达式。

/^\d+(\.\d+){1,2}(_[EF]B\d+)?$/