正则表达式 – 如何从Perl中的字符串中提取子串?

考虑以下字符串:

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*(\*)?
相关文章
相关标签/搜索