regex - tester - ¿Cómo puedo encontrar una subcadena dentro de una cadena usando Perl?
perl=~ (4)
Tengo una cadena desde la que deseo extraer una sola palabra, pero con un número adicional, que puede ser diferente en cada línea:
This is string1 this is string
This is string11
This is string6 and it is in this line
Quiero analizar este archivo y obtener los valores de "stringXXX", comenzando desde 0 hasta 100
# suppose ABC.txt contains the above lines
FH1 = open "Abc.txt";
@abcFile = <FH1>;
foreach $line(@abcFile) {
if ($pattern =~ s/string.(d{0}d{100});
print $pattern;
Lo anterior imprime toda la línea, deseo obtener solo stringXXX
Abc.pl:
#!/usr/bin/perl -w
while(<>) {
while (/(string(/d{1,3}))/g) {
print "$1/n" if $2 <= 100;
}
}
Ejemplo:
$ cat Abc.txt
This is string1 this is string
This is string11
This is string6 and it is in this line
string1 asdfa string2
string101 string3 string100 string1000
string9999 string001 string0001
$ perl Abc.pl Abc.txt
string1
string11
string6
string1
string2
string3
string100
string100
string001
string000
$ perl -nE"say $1 while /(string(?:100|/d{1,2}(?!/d)))/g" Abc.txt
string1
string11
string6
string1
string2
string3
string100
string100
Tenga en cuenta la diferencia entre las salidas. Lo que es preferible depende de tus necesidades.
Simplemente cambie print $ pattern para imprimir $ &, que ya está capturado.
No sobreespecifique. Para capturar la parte numérica, simplemente use (/ d +). Esto capturará una cantidad de cualquier longitud, de modo que algún día cuando los monos que le proporcionan este archivo decidan ampliar su rango hasta 999, estará cubierto. También es menos pensado, tanto ahora cuando estás escribiendo, y más tarde cuando estás manteniendo.
Sea estricto en lo que emita, pero sea liberal en lo que acepta.
necesitas capturarlo:
while ($pattern =~/(string(100|/d{1,2}))/g) {
print $1;
}
Explicación:
- los paréntesis capturan lo que hay en ellos en $ 1. Si tiene más de un juego de paréntesis, el primero lo convierte en $ 1, el segundo en $ 2, etc. En este caso, $ 2 tendrá el número real.
- / d {1,2} captura entre 1 y 3 dígitos, lo que le permite capturar entre 0 y 99. Los 100 adicionales allí le permiten capturar 100 de forma explícita, ya que es el único número de 3 dígitos que desea emparejar.
editar: arregla el orden de los números que se capturan.