考虑以下字符串:
1)方案编号:abc-456-hu5t10(高优先级)*****
2)方案编号:frt-78f-hj542w(平衡)
3)方案ID:23f-f974-nm54w(超级公式运行)*****
等等在上述格式 – 粗体的部分是跨字符串的变化.
==>想象一下,我有很多格式的字符串如上所示.
我想从上述每个字符串中选择3个子字符串(如下面的BOLD所示).
>包含字母数字值的第一个子字符串(例如上面是“abc-456-hu5t10”)
>包含该字的第二个子字符串(例如上面的“高优先级”)
>第三个子字符串包含*(IF *存在于字符串ELSE的末尾离开它)
如何从上面显示的每个字符串中选取这3个子字符串?我知道它可以使用Perl中的正则表达式…可以帮助吗?
你可以这样做:
my $data = <<END; 1) Scheme ID: abc-456-hu5t10 (High priority) * 2) Scheme ID: frt-78f-hj542w (Balanced) 3) Scheme ID: 23f-f974-nm54w (super formula run) * END foreach (split(/\n/,$data)) { $_ =~ /Scheme ID: ([a-z0-9-]+)\s+\(([^)]+)\)\s*(\*)?/ || next; my ($id,$word,$star) = ($1,$2,$3); print "$id $word $star\n"; }
关键是正则表达式:
Scheme ID: ([a-z0-9-]+)\s+\(([^)]+)\)\s*(\*)?
其中分解如下.
固定字符串“方案ID:”:
Scheme ID:
其次是一个或多个字符a-z,0-9或 – .我们使用括号将其视为$1:
([a-z0-9-]+)
后面有一个或多个空格字符:
\s+
随后是一个开放的支架(我们逃脱),后面是任意数量的不是一个关闭支架的字符,然后是一个关闭支架(转义).我们使用未转义的括号来捕获单词为$2:
\(([^)]+)\)
跟随一些空格,可能是*,被捕获为$3:
\s*(\*)?