0

尝试从此字符串中提取字母数字字符:

A_phase_I-II,_open-req_project_id_PX15RAD001

问题是:PX15RAD001 一词可以出现在字符串中的任何位置。

尝试使用以下表达式提取字母数字部分。但这会返回整个字符串。我认为 Alum 是字母数字的有效关键字。不是这样吗?

(my $string = $line ) =~ s/\P{Alnum}//g;
  print $string;

如何提取上述字符串的字母数字部分?

提前致谢。-西马克

4

3 回答 3

0

以下是一些测试用例,由@Vijay 的回答的评论产生:

my @line = (
  'A_phase_I-II,_open-req_project_id_PX15RAD001',
  '_PX15RAD001_A_phase_I-II,_open-req_project_id',
  'A_pha3333se_I-II,_ope_PX15RAD001_n-req_project',
  'A_phase_I-II,_PX15RAD001_open-req_projec123123123t_id',
  'A_phase_I-II_PX15RAD001_roject_id'
);
foreach my $string ( @line ) {
  $string =~ m{_([^_]{10})_?}g;
  print $1 . "\n" if $1;
}
于 2013-06-27T12:25:08.857 回答
0

最后根据您的输入:

> echo "A_phase_I-II,_open-req_project_id_PX15RAD001"|perl -lne 'print $1 if(/id_([A-Z0-9]*)/)'
PX15RAD001

在中间:

> echo "A_phase_I-II,_open-req_id_PX15RAD001_project" | perl -lne 'print $1 if(/id_([A-Z0-9]*)/)'
PX15RAD001

或者用你的话:

$line=~m/id_([A-Z0-9]*)/g;
print $1;
于 2013-06-27T11:42:53.457 回答
0

这类问题很难回答,因为没有足够的信息。我们掌握的信息是:

  • 你说你的目标字符串是“字母数字”,但整个输入字符串都是字母数字,除了一些标点符号,所以这真的没有告诉我们任何事情。
  • 你说它有 12 个字符长,但你展示的示例是 10 个字符长。
  • 您似乎认为“字母数字”不包括下划线。

所以,我能从你那里得到的可靠信息

  • 目标字符串始终由下划线分隔_
  • 目标字符串为 10-12 个字符,除下划线外全部为字母数字。

基于这个相当少的信息的“可靠”解决方案是:

my $str = "A_phase_I-II,_open-req_project_id_PX15RAD001";

for my $field (split /_/, $str) {
    if (length($field) <= 12 and    
        length($field) >= 10 and    # field is 10-12 characters
        $field !~ /\W/) {           # and contains no non-alphanumerics
        # do something
    }
}

通过下划线拆分,我们可以轻松地隔离字符串中的每个字段并对其执行更简单的测试,例如上面的那些。

于 2013-06-27T12:38:28.363 回答