versiones guia español descargar actualizar regex algorithm language-agnostic

regex - guia - qgis manual



Encontrar los números de teléfono en 50,000 páginas HTML (8)

¿Cómo se encuentran los números de teléfono en 50,000 páginas HTML?

Jeff Attwood publicó 5 preguntas para los programadores que solicitan puestos de trabajo:

En un esfuerzo por simplificar la vida de los revisores de teléfonos, he creado esta lista de cinco preguntas esenciales que debe realizar durante una pantalla de SDE. No garantizarán que su candidato sea excelente, pero ayudarán a eliminar a un gran número de candidatos que hoy se están deslizando en nuestro proceso.

1) Codificación El candidato tiene que escribir un código simple, con la sintaxis correcta, en C, C ++ o Java.

2) Diseño de OO El candidato tiene que definir los conceptos básicos de OO y crear clases para modelar un problema simple.

3) Scripting y expresiones regulares El candidato tiene que describir cómo encontrar los números de teléfono en 50,000 páginas HTML.

4) Estructuras de datos El candidato debe demostrar conocimiento básico de las estructuras de datos más comunes.

5) Bits y bytes El candidato tiene que responder preguntas simples sobre bits, bytes y números binarios.

Por favor, comprenda: lo que estoy buscando aquí es un vacío total en una de estas áreas. Está bien si luchan un poco y luego lo resuelven. Está bien si necesitan algunas sugerencias o pautas menores. No me importa si están oxidados o son lentos. Lo que estás buscando son candidatos que no tienen ni idea ni están terriblemente confundidos sobre el área en cuestión.

>>> La totalidad del mensaje original de Jeff <<<


Nota: Steve Yegge originalmente planteó la Pregunta.


Solución Perl

Por: "MH" a través de codinghorror, com el 5 de septiembre de 2008 a las 07:29 AM

#!/usr/bin/perl while (<*.html>) { my $filename = $_; my @data = <$filename>; # Loop once through with simple search while (@data) { if (//(?(/d/d/d)/)?[ -]?(/d/d/d)-?(/d/d/d/d)/) { push( @files, $filename ); next; } } # None found, strip html $text = ""; $text .= $_ while (@data); $text =~ s#<[^>]+>##gxs; # Strip line breaks $text =~ s#/n|/r##gxs; # Check for occurrence. if ( $text =~ //(?(/d/d/d)/)?[ -]?(/d/d/d)-?(/d/d/d/d)/ ) { push( @files, $filename ); next; } } # Print out result print join( ''/n'', @files );


Aquí hay un patrón de expresiones regulares mejorado

/(?/d{3}/)?[-/s/.]?/d{3}[-/s/.]?/d{4}

Es capaz de identificar varios formatos numéricos

  1. xxx.xxx.xxxx
  2. xxx.xxxxxxx
  3. xxx-xxx-xxx
  4. xxxxxxxxxx
  5. (xxx) xxx xxxx
  6. (xxx) xxx-xxxx
  7. (xxx) xxx-xxxx

Estas son las razones por las cuales las preguntas sobre la codificación de la entrevista telefónica no funcionan:

screener de teléfono: ¿cómo se encuentran los números de teléfono en 50,000 páginas HTML?

candidato: espere un segundo (cubre el teléfono) oye (compañero de cuarto / amigo / etc. que es muy bueno en la programación), ¿cómo se encuentran los números de teléfono en 50,000 páginas HTML?

Guarde las preguntas de codificación para el comienzo de la entrevista en persona y haga que las preguntas de la entrevista sean más personales, es decir, "Me gustaría obtener detalles sobre la última vez que resolvió un problema utilizando el código". Esa es una pregunta que requerirá seguimiento de sus detalles y es mucho más difícil conseguir que otra persona lo responda por usted sin sonar extraño por teléfono.


Hecho esto en Java. La expresión regular fue tomada de este foro .

final String regex = "[//s](//({0,1}//d{3}//){0,1}" + "[- //.]//d{3}[- //.]//d{4})|" + "(//+//d{2}-//d{2,4}-//d{3,4}-//d{3,4})"; final Pattern phonePattern = Pattern.compile(regex); /* The result set */ Set<File> files = new HashSet<File>(); File dir = new File("/initDirPath"); if (!dir.isDirectory()) return; for (File file : dir.listFiles()) { if (file.isDirectory()) continue; BufferedReader reader = new BufferedReader(new FileReader(file)); String line; boolean found = false; while ((line = reader.readLine()) != null && !found) { if (found = phonePattern.matcher(line).find()) { files.add(file); } } } for (File file : files) { System.out.println(file.getAbsolutePath()); }

¡Realicé algunas pruebas y todo salió bien! :) Recuerda que no estoy tratando de usar el mejor diseño aquí. Acabo de implementar el algoritmo para eso.


Tomando prestado 2 cosas de la respuesta C # de sieben, aquí hay un pequeño fragmento de F # que hará el trabajo. Lo único que falta es una forma de llamar a processDirectory, que se omite intencionalmente :)

open System open System.IO open System.Text.RegularExpressions let rgx = Regex(@"(/({0,1}/d{3}/){0,1}[- /.]/d{3}[- /.]/d{4})|(/+/d{2}-/d{2,4}-/d{3,4}-/d{3,4})", RegexOptions.Compiled) let processFile contents = contents |> rgx.Matches |> Seq.cast |> Seq.map(fun m -> m.Value) let processDirectory path = Directory.GetFiles(path, "*.html", SearchOption.AllDirectories) |> Seq.map(File.ReadAllText >> processFile) |> Seq.concat


amo hacer estos pequeños problemas, no puedo ayudarme a mí mismo.

no estoy seguro de si valió la pena hacerlo, ya que es muy similar a la respuesta de Java.

private readonly Regex phoneNumExp = new Regex(@"(/({0,1}/d{3}/){0,1}[- /.]/d{3}[- /.]/d{4})|(/+/d{2}-/d{2,4}-/d{3,4}-/d{3,4})"); public HashSet<string> Search(string dir) { var numbers = new HashSet<string>(); string[] files = Directory.GetFiles(dir, "*.html", SearchOption.AllDirectories); foreach (string file in files) { using (var sr = new StreamReader(file)) { string line; while ((line = sr.ReadLine()) != null) { var match = phoneNumExp.Match(line); if (match.Success) { numbers.Add(match.Value); } } } } return numbers; }


egrep ''(? / d {3})? [- / s.]? / d {3} [-.] / d {4}'' * .html


egrep "(([0-9]{1,2}.)?[0-9]{3}.[0-9]{3}.[0-9]{4})" . -R --include=''*.html''