2013-06-27 30 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 
    } 
} 

通過在下劃線分割,我們可以很容易地在字符串中隔離每個字段,並執行就可以了簡單的測試,如上面的那些。

相關問題