2012-06-12 1 views
-1

Я хочу только первый рисунок до slash_flash захвачен.Perl не-жадный матч

Я попытался это:

$var1 = slash_flash*_target_bit[*]_slash_hit\n 

$var1 =~ s/^(.*)\*?(.*)$/$1/g if ($var1 =~ /\*/); 

Я получаю всю строку обратно:

> $var1 = slash_flash*_target_bit[*]_slash_hit 

Примечание: $ var1 может начать с чем-нибудь. Таким образом, вы не можете начать сопоставление шаблонов с определенным словом или рисунком. Вот почему я попробовал (. *)

ответ

2

Во-первых, напишите код, который вы на самом деле бежали. То, что вы сказали, неверно, потому что то, что вы отправили, даже не компилируется.

Переезд.

  • \*? может соответствовать нулевым символам.
  • .* может соответствовать нулевым символам.

Так как только первые .* матчи всю строку, \*? и .* счастливо совпадают нулевые символы.

Может быть, вы хотите

$var =~ s/^([^*]*)\*.*$/$1/g if ($var1 =~ /\*/); 

, который может быть сокращен до

$var =~ s/^([^*]*)\*.*$/$1/; 

Или даже

$var =~ s/^[^*]*\K\*.*$//; 
+0

Я обновленный вопрос, основанный на этом. Как заставить шаблон соответствовать любой из следующих двух строк: «code» $ var1 = slash_flashold_target_bit [0] или $ var1 = clone_flashnew_target_bit [5] –

+0

@cosmo kramer, зависит от конкретного вы хотите быть '/.*/' должно сработать. '/^(?: slash_flashold_target_bit \ [0 \] | clone_flashnew_target_bit \ [5 \]) \ z /' будет соответствовать только этим двум строкам. Возможно, вы ищете что-то вроде '/ _flashold_target_bit \ [[0-9] + \] \ z /'. – ikegami