我很感激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 |
+---------+--------+-------+
我感谢任何人都可以提供帮助。
感谢。
答案 0 :(得分:2)
在正则表达式的末尾粘贴$
,它应该有效:
/^\s*([0-9]+)\.([0-9]+)(\.([0-9]+))?(_[EF]B([0-9]+))?$/
您可以找到在线解释和演示here
如果没有$
锚点,则正则表达式将匹配1.2
,1.2.
,1.2_
,1.2_E
,{{1.2_FB
部分1}},1.2_GB4
,1.2.3_
和1.2.3_E
然后退出而不尝试匹配更多内容。
如果您不需要捕获捕获组中的数字,可以稍微简化一下:
1.2.3_GB4
答案 1 :(得分:1)
你可以使用锚点并简化你的正则表达式。
/^\d+(\.\d+){1,2}(_[EF]B\d+)?$/