简体   繁体   English

将正则表达式与perl / sed / awk中的可变字符串匹配

[英]match regexp against variable string in perl/sed/awk

I have this expression: 我有这个表达:

XX h, YY min, ZZ s, XX小时,YY分钟,ZZ秒,

XX, YY or ZZ can be 1 or 2 digits. XX,YY或ZZ可以是1或2位数字。 Also "XX h," or "XX h, YY min," maybe not present. 另外,“ XX h”或“ XX h,YY min”也可能不存在。 Can anyone recommend any perl or sed expression to extract XX YY and ZZ?? 任何人都可以推荐任何perl或sed表达式来提取XX YY和ZZ吗?

I've tried some matching group regexp with no luck. 我尝试了一些匹配的组正则表达式,但是没有运气。

thanks 谢谢

EDIT: 编辑:

example1: 12 h, 23 min, 2 s, 范例1:12小时23分钟2秒,

output1: 12 23 2 输出1:12 23 2

example2: 3 min, 59 s, 范例2:3分钟59秒,

output2: 3 59 输出2:3 59

Try this (Perl): 试试这个(Perl):

my @matches = "1 h, 30 min, 15 s" =~ /(\d{1,2}) [hms]/g;

Or a bit stricter 或更严格一点

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";
}
echo "12 h, 3 min, 56 s," | tr -cd "0-9 "

Output: 输出:

12  3  56

echo "12 h, 3 min, 56 s," | tr "," "\n" | awk '/h/ {print $1}'

12 12

echo "12 h, 3 min, 56 s," | tr "," "\n" | awk '/min/ {print $1}'

3 3

echo "12 h, 3 min, 56 s," | tr "," "\n" | awk '/s/ {print $1}'

56 56

Let's talk about Perl regex. 让我们谈谈Perl正则表达式。 Let's assume you need to be able to extract the following substrings: 假设您需要能够提取以下子字符串:

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,

and so on. 等等。 We will need some building blocks: 我们将需要一些构建块:

\\d : any digit \\d :任意数字
? : when appended to something (a character, a meta-character like \\d or a group in brackets), make it optional :附加到某物(字符, \\d类的元字符或方括号中的组)后,使其成为可选
( ) : brackets for grouping and extracting values into $1 , $2 , etc. ( ) :用于将值分组和提取为$1$2等的方括号。
(?: ) : brackets for grouping without extracting (?: ) :):不提取而分组的方括号

The seconds part will be \\d\\d? s, 秒部分将是\\d\\d? s, \\d\\d? s, . \\d\\d? s,
After adding minutes that can be optional, we'll get (?:\\d\\d? min, )?\\d\\d? s, 在添加可以选择的分钟后,我们将得到(?:\\d\\d? min, )?\\d\\d? s, (?:\\d\\d? min, )?\\d\\d? s, . (?:\\d\\d? min, )?\\d\\d? s,
After adding hours (also optional), we'll get (?:(?:\\d\\d? h,)? \\d\\d? min, )?\\d\\d? s, 添加小时(也是可选的)后,我们将获得(?:(?:\\d\\d? h,)? \\d\\d? min, )?\\d\\d? s, (?:(?:\\d\\d? h,)? \\d\\d? min, )?\\d\\d? s, . (?:(?:\\d\\d? h,)? \\d\\d? min, )?\\d\\d? s,
Now we'll use brackets around all this staff for capturing the match into $1 and we'll finally get a regex: 现在,我们将在所有这些人员周围使用方括号将匹配项捕获到$1 ,最后得到一个正则表达式:

/((?:(?:\d\d? h,)? \d\d? min, )?\d\d? s,)/

Or, and is the trailing comma also optional? 还是,结尾逗号也是可选的吗? Just add ? 只需添加? after it. 之后。

If you need the values for h , min , and s , put each \\d\\d? 如果您需要hmins的值,请放置每个\\d\\d? into a pair of brackets and check $2 , $3 and $4 : 放入一对方括号中,并检查$2$3$4

/((?:(?:(\d\d?) h,)? (\d\d?) min, )?(\d\d?) s,)/

This is not the easiest possible regex for this task but I just wanted to show how you can build them starting from something very simple and then adding more complex things to it. 这不是完成此任务的最简单的正则表达式,但我只是想展示如何从非常简单的内容开始,然后向其中添加更复杂的内容来构建它们。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM