Coincidencia no codiciosa de Perl

Solo quiero capturar el primer patrón hasta slash_flash.

Intenté esto:

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

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

Obtengo toda la cadena de vuelta:

> $var1 = slash_flash*_target_bit[*]_slash_hit

Nota: $var1 puede comenzar con cualquier cosa. Por lo tanto, no puede iniciar la coincidencia de patrones con una palabra o patrón en particular. Por eso probé (.*)

preguntado el 12 de junio de 12 a las 20:06

1 Respuestas

Primero, publique el código que realmente ejecutó. Lo que dijiste no es cierto porque lo que publicaste ni siquiera compila.

Continuando.

  • \*? puede coincidir con cero caracteres.
  • .* puede coincidir con cero caracteres.

Así que una vez que la primera .* coincide con toda la cadena, \*? y .* felizmente coincide con cero caracteres.

Tal vez quieras

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

que se puede acortar a

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

O incluso a

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

Respondido el 12 de junio de 12 a las 20:06

Tenía una pregunta actualizada basada en esto. ¿Cómo hago que el patrón coincida con cualquiera de las dos líneas siguientes? :'code' $var1 = slash_flashold_target_bit[0] o $var1 = clone_flashnew_target_bit[5] cosmo kramer

@cosmo kramer, depende de lo específico que quieras ser /.*/ funcionaría. /^(?:slash_flashold_target_bit\[0\]|clone_flashnew_target_bit\[5\])\z/ coincidiría sólo con esas dos líneas. Tal vez estés buscando algo como /_flashold_target_bit\[[0-9]+\]\z/. - Ikegami

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.