2013-06-27 31 views
0

试图从这个字符串中提取的字母数字字符:提取字母词从一个字符串

A_phase_I-II,_open-req_project_id_PX15RAD001 

的问题是:术语PX15RAD001可以在字符串中的任何地方发生。

尝试使用下面的表达式提取字母数字部分。但是这会返回整个字符串。我认为Alum是用于字母数字的有效关键字。情况并非如此吗?

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

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

在此先感谢。 -simak

+1

输出结果如何显示? – 2013-06-27 11:34:46

+0

感谢您的回复。我需要提取的输出是:PX15RAD001。这个术语可以发生在字符串的任何地方 - 可以在开头或其他地方。 – BRZ

+1

“但它总是以”_“开头......”这不够好。 '_phase','_project'和'_id'前面还有下划线。你需要更具体。 – doubleDown

回答

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; 
+0

谢谢。如果我将它分配给一个变量。它是否正确?我的($ string = $ line)=〜s /(A-Z0-9] *)/ – BRZ

+0

'$ line =〜m/id _(\ w *)_?/; my $ string = $ 1;' – 2013-06-27 11:57:38

+0

This wont因为它假定该术语始终优先于id_。这可能是也可能不是这种情况。字母数字术语也可以出现在字符串的开头。 – BRZ

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; 
} 
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 
    } 
} 

通过在下划线分割,我们可以很容易地在字符串中隔离每个字段,并执行就可以了简单的测试,如上面的那些。

相关问题