我有这个表达:
XX h,YY min,ZZ s,
XX,YY或ZZ可以是1或2位数。另外" XX h,"或者" XX h,YY min,"也许不在场。任何人都可以推荐任何perl或sed表达式来提取XX YY和ZZ ??
我尝试了一些匹配的群组正则表达式而没有运气。
谢谢
编辑:
示例1:12小时,23分钟,2秒,
output1:12 23 2
示例2:3分钟,59秒,
output2:3 59
答案 0 :(得分:1)
试试这个(Perl):
my @matches = "1 h, 30 min, 15 s" =~ /(\d{1,2}) [hms]/g;
或者更严格
my @matches = "1 h, 30 min, 15 s" =~ /(\d{1,2}) (?:h|min|s)/g;
if(scalar @matches == 3) {
my ($h, $mi, $s) = @matches;
print "$h : $mi : $s\n";
}
答案 1 :(得分:1)
echo "12 h, 3 min, 56 s," | tr -cd "0-9 "
输出:
12 3 56
echo "12 h, 3 min, 56 s," | tr "," "\n" | awk '/h/ {print $1}'
12
echo "12 h, 3 min, 56 s," | tr "," "\n" | awk '/min/ {print $1}'
3
echo "12 h, 3 min, 56 s," | tr "," "\n" | awk '/s/ {print $1}'
56
答案 2 :(得分:1)
让我们谈谈Perl正则表达式。我们假设您需要能够提取以下子字符串:
12 h, 54 min, 11 s, # you have a trailing comma in your example
1 h, 54 min, 11 s,
54 min, 11 s,
4 min, 11 s,
55 s,
等等。我们需要一些构建块:
\d
:任何数字
?
:当附加到某个内容(字符,\d
之类的元字符或括号中的组)时,将其设为可选项
( )
:用于将值分组并提取到$1
,$2
等的括号
(?: )
:用于分组而不提取
秒部分为\d\d? s,
添加可选的分钟后,我们将获得(?:\d\d? min, )?\d\d? s,
添加小时(也可选)后,我们会获得(?:(?:\d\d? h,)? \d\d? min, )?\d\d? s,
现在我们在所有这些工作人员周围使用括号将匹配项捕获到$1
,我们终于得到一个正则表达式:
/((?:(?:\d\d? h,)? \d\d? min, )?\d\d? s,)/
或者,尾随逗号也是可选的吗?只需在其后添加?
即可。
如果您需要h
,min
和s
的值,请将每个\d\d?
放入一对括号并检查$2
,{{ 1}}和$3
:
$4
这不是这项任务最简单的正则表达式,但我只想展示如何从非常简单的东西开始构建它们,然后向它添加更复杂的东西。