20

50,000 ページの HTML ページから電話番号を見つける方法は?

Jeff Attwood は、仕事に応募するプログラマー向けに 5 つの質問を投稿しました。

電話スクリーナーの作業を簡素化するために、SDE スクリーニング中に尋ねる必要がある 5 つの重要な質問のリストをまとめました。あなたの候補者が優秀であることを保証するものではありません。

1) コーディング受験者は、C、C++、または Java で、正しい構文で簡単なコードを作成する必要があります。

2) OO 設計候補者は、基本的な OO の概念を定義し、単純な問題をモデル化するためのクラスを考え出す必要があります。

3) スクリプトと正規表現受験者は、50,000 ページの HTML で電話番号を見つける方法を説明する必要があります。

4) データ構造受験者は、最も一般的なデータ構造に関する基本的な知識を示さなければなりません。

5) ビットとバイト受験者は、ビット、バイト、および 2 進数に関する簡単な質問に答えなければなりません。

理解してください: 私がここで探しているのは、これらの領域の 1 つで完全に真空であることです。彼らが少し苦労してから理解すればOKです。ちょっとしたヒントやプロンプトが必要な場合は問題ありません。錆びていても遅くても構いません。あなたが探しているのは、問題の分野についてまったく無知であるか、ひどく混乱している候補者です。

>>> ジェフのオリジナル投稿の全文 <<<


注: Steve Yegge が最初に質問を提起しました。

4

8 に答える 8

26
egrep "(([0-9]{1,2}.)?[0-9]{3}.[0-9]{3}.[0-9]{4})" . -R --include='*.html'
于 2008-09-07T21:53:17.523 に答える
3

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

いくつかのテストを実行し、それはうまくいきました!:)覚えておいてください私はここで最高のデザインを使おうとはしていません。そのためのアルゴリズムを実装しただけです。

于 2008-09-07T21:06:48.787 に答える
3

これが改良された正規表現パターンです

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

いくつかの数値形式を識別できます

  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
于 2013-03-23T21:11:20.850 に答える
2

siebenからのC#の回答から2つを借りて、これがその仕事をする小さな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
于 2009-04-04T12:23:43.493 に答える
2
egrep '\(?\d{3}\)?[-\s.]?\d{3}[-.]\d{4}' *.html
于 2008-09-07T21:36:54.083 に答える
1

Perlソリューション

投稿者:2008年9月5日午前7時29分にcodinghorror、com経由の「MH」

#!/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 );
于 2008-09-07T20:43:34.040 に答える
1

私はこれらの小さな問題をするのが大好きです、自分自身を助けることはできません。

それは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;
}
于 2008-09-07T22:06:18.257 に答える
-1

電話インタビューのコーディングの質問が機能しない理由は次のとおりです。

電話スクリーナー: 50,000 の HTML ページから電話番号を見つけるにはどうすればよいですか?

候補者: ちょっと待ってください (電話をカバーします) ねえ (ルームメイト/友人/プログラミングがとても上手な人)、どうやって 50,000 ページの HTML ページから電話番号を見つけますか?

コーディングに関する質問は対面インタビューの早い段階で取っておき、インタビューの質問はより個人的なものにします。たとえば、「最後にコードを使用して問題を解決したときの詳細を教えてください」などです。それは彼らの詳細へのフォローアップを求める質問であり、電話で奇妙に聞こえることなく他の人に答えてもらうことははるかに困難です.

于 2008-09-21T10:50:37.520 に答える