Поиск телефонных номеров в 50 000 HTML-страниц - PullRequest
18 голосов
/ 08 сентября 2008

Как найти телефонные номера в 50 000 HTML-страниц?

Джефф Этвуд опубликовал 5 вопросов для программистов, претендующих на работу:

Чтобы облегчить жизнь специалистам по проверке телефонов, я собрал вместе этот список пяти основных вопросов что вы должны спросить во время SDE экран. Они не будут гарантировать, что ваш кандидат будет великим, но они будут помочь устранить огромное количество кандидаты, которые проскальзывают наш процесс сегодня.

1) Кодирование Кандидат должен написать некоторый простой код с правильным синтаксисом, в C, C ++ или Java.

2) ОО дизайн Кандидат должен определить основные концепции ОО и придумать с классами для моделирования простого проблема.

3) Сценарии и регулярные выражения кандидат должен описать, как найти номера телефонов в 50000 HTML страниц.

4) Структуры данных Кандидат имеет продемонстрировать базовые знания о Наиболее распространенные структуры данных.

5) Биты и байты Кандидат имеет отвечать на простые вопросы о битах, байты и двоичные числа.

Пожалуйста, поймите: что я ищу ибо здесь полный вакуум в одном из эти районы. Это нормально, если они борются немного, а потом разобраться. Это Хорошо, если они нуждаются в незначительных подсказках или побуждая. Я не против, если они ржавый или медленный. Что вы ищете это кандидаты, которые совершенно невежественный или ужасно запутанный, о область, о которой идет речь.

>>> Полное оригинальное сообщение Джеффа <<< </a>


Примечание: Стив Йегге первоначально задал вопрос.

Ответы [ 8 ]

26 голосов
/ 08 сентября 2008
egrep "(([0-9]{1,2}.)?[0-9]{3}.[0-9]{3}.[0-9]{4})" . -R --include='*.html'
3 голосов
/ 24 марта 2013

Вот улучшенный шаблон регулярных выражений

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

Может идентифицировать несколько числовых форматов

  1. xxx.xxx.xxxx
  2. xxx.xxxxxxx
  3. ххх-ххх-ххх
  4. XXXXXXXXXX
  5. (ххх) ххх хххх
  6. (ххх) ххх-хххх
  7. (ххх) ххх-хххх
3 голосов
/ 08 сентября 2008

Сделано это на Java. Регулярное выражение было позаимствовано у этого форума .

    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());
    }

Выполнены некоторые тесты, и все прошло хорошо! :) Помните, я не пытаюсь использовать лучший дизайн здесь. Только что реализовал алгоритм для этого.

2 голосов
/ 04 апреля 2009

Заимствуя 2 вещи из ответа C # от sieben, вот небольшой фрагмент F #, который сделает эту работу. Все, чего ему не хватает, - это способа вызвать processDirectory, который намеренно опущен:)


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
2 голосов
/ 08 сентября 2008

egrep '(? \ D {3})? [- \ s.?

1 голос
/ 08 сентября 2008

Я люблю делать эти маленькие проблемы, не могу с собой поделать.

не уверен, стоит ли это делать, поскольку он очень похож на ответ 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;
}
1 голос
/ 08 сентября 2008

Perl Solution

Автор: "MH" через codinghorror, com 5 сентября 2008 г., 07:29

#!/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 );
0 голосов
/ 21 сентября 2008

Вот почему вопросы кодирования телефонных интервью не работают:

Экран телефона: как найти телефонные номера в 50000 HTML-страницах?

кандидат: повесить на одну секунду (охватывает телефон) эй (сосед по комнате / друг / и т.д., который очень хорош в программировании), как найти телефонные номера в 50 000 HTML-страниц?

Сохраните вопросы кодирования для начала личного интервью и сделайте вопросы интервью более личными, т. Е. «Мне бы хотелось узнать подробности о том, когда вы в последний раз решали проблему с помощью кода». Это вопрос, который потребует дополнения к их деталям, и гораздо сложнее найти кого-то, кто ответит на него, не говоря странно по телефону.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...