如何从Perl中的字符串中提取子字符串?

sta*_*NCT 15 regex string perl

请考虑以下字符串:

1)方案编号:abc-456-hu5t10(高优先级)*****

2)方案编号:frt-78f-hj542w(平衡)

3)方案ID:23f-f974-nm54w(超级配方运行)*****

以上述格式等等 - 粗体部分是字符串的变化.

==> 想象一下,我上面有很多格式的字符串. 我想从上面的每个字符串中选择3个子串(如下面的BOLD所示).

  • 包含字母数字值的第一个子字符串(例如在它上面的"abc-456-hu5t10")
  • 包含该单词的第二个子字符串(例如在其上方的"高优先级")
  • 第3个子字符串包含*(IF*出现在字符串的末尾ELSE)

如何从上面显示的每个字符串中选择这3个子串?我知道可以使用Perl中的正则表达式来完成...你能帮忙吗?

Dav*_*ebb 32

你可以这样做:

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";
}
Run Code Online (Sandbox Code Playgroud)

关键是正则表达式:

Scheme ID: ([a-z0-9-]+)\s+\(([^)]+)\)\s*(\*)?
Run Code Online (Sandbox Code Playgroud)

其中分解如下.

固定字符串"Scheme ID:":

Scheme ID: 
Run Code Online (Sandbox Code Playgroud)

后跟一个或多个字符az,0-9或 - .我们使用括号将其捕获为$ 1:

([a-z0-9-]+)
Run Code Online (Sandbox Code Playgroud)

后跟一个或多个空白字符:

\s+
Run Code Online (Sandbox Code Playgroud)

接下来是一个左括号(我们将其转义),后跟任意数量的非紧密括号的字符,然后是一个右括号(转义).我们使用未转义的括号将单词捕获为$ 2:

\(([^)]+)\)
Run Code Online (Sandbox Code Playgroud)

随后是一些空格,可能是*,被捕获为3美元:

\s*(\*)?
Run Code Online (Sandbox Code Playgroud)


Gre*_*ill 5

您可以使用如下的正则表达式:

/([-a-z0-9]+)\s*\((.*?)\)\s*(\*)?/
Run Code Online (Sandbox Code Playgroud)

例如:

$s = "abc-456-hu5t10 (High priority) *";
$s =~ /([-a-z0-9]+)\s*\((.*?)\)\s*(\*)?/;
print "$1\n$2\n$3\n";
Run Code Online (Sandbox Code Playgroud)

印刷

abc-456-hu5t10
高优先级
*