Подтвердить что ты не робот

Поиск номеров телефонов на 50 000 HTML-страницах

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

Jeff Attwood опубликовал 5 вопросов для программистов, подающих заявки на задания:

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

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

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

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

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

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

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

→ > Целая часть оригинального сообщения Джеффа < <


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

4b9b3361

Ответ 1

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

Ответ 2

Сделано на 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());
    }

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

Ответ 3

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

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

Он способен идентифицировать несколько форматов чисел

  • xxx.xxx.xxxx
  • xxx.xxxxxxx
  • ххх-ххх-ххх
  • XXXXXXXXXX
  • (xxx) xxx xxxx
  • (xxx) xxx-xxxx
  • (ххх) ххх-хххх

Ответ 4

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

Ответ 5

Заимствуя 2 вещи из ответа С# от 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

Ответ 6

Решение Perl

По: "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 );

Ответ 7

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

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

Ответ 8

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

phone screener: как вы находите номера телефонов на 50 000 HTML-страницах?

кандидат: на одну секунду (покрывает телефон) hey (roommate/friend/etc, который отлично разбирается в программировании), как вы находите номера телефонов на 50 000 HTML-страницах?

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