尝试从以下字符串中提取字母数字字符:
A_phase_I-II,_open-req_project_id_PX15RAD001
问题是:术语PX15RAD001可以出现在字符串中的任何位置。
正在尝试使用以下表达式提取字母数字部分。但这会返回整个字符串。我认为Alum是字母数字的有效关键字。事实并非如此吗?
(my $string = $line ) =~ s/P{Alnum}//g;
print $string;
如何提取上述字符串的字母数字部分?
提前谢谢。-simak
根据您的输入结束:
> 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;
以下是一些测试用例,由@Vijay的Answer:注释生成
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;
}
这类问题很难回答,因为没有足够的信息。我们掌握的信息是:
- 你说你的目标字符串是"字母数字",但除了一些标点符号外,整个输入字符串都是字母数字,所以这并不能告诉我们什么
- 你说它有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
}
}
通过在下划线上进行拆分,我们可以轻松地隔离字符串中的每个字段,并对其执行更简单的测试,例如上面的测试。