2013-09-25 2 views
1

У меня есть эта строка:Как REGEX извлекать что-то из строки

[1] "RPKM_AB123_Gm12878_control.extended.bed_28m_control_500 and RPKM_AB156_GM12878-50ng_test.extended.bed_28m_test_500" 

, и я хочу, чтобы извлечь AB123_Gm12878_control и AB156_GM12878-50ng из строки.

Я пробовал, и он еще не работает.

if ($_ =~ /.*"RPKM_([\w.]+).extended.+\s\w+\sRPKM_([\w.]+).extended.+"/){ 
    print $1,"\t",$2,"\t"; 
} 

Может кто-нибудь указать, где я сделал это неправильно? Благодаря!

ответ

3
".*RPKM_([\w.]+).extended.+\s\w+\sRPKM_([\w.]+).extended.+" 
             ^^^^^ 

класс Этого персонажа не принимает - какой строки вашего соответствия против содержит.

Попробуйте поставить дефис:

".*RPKM_([\w.]+)\.extended.+\s\w+\sRPKM_([\w.-]+)\.extended.+" 

Кроме того, это хорошо, чтобы избежать периодов.

+0

Периоды, с другой стороны, вероятно, следует * не * быть в charclasses. – amon

+0

@amon Вероятно. Не знаю, имеет ли OP строки, в которых части, которые должны быть извлечены, содержат эти ... – Jerry

+0

Один дефис, кажется, решает проблему !!! – olala

1

Вы можете упростить регулярное выражение и сопоставить все случаи использования /g

if (my($m1, $m2) = /RPKM_([^.]+)/g) { 
    print $m1,"\t",$m2,"\t"; 
} 
+0

простой. благодаря! – olala

Смежные вопросы