20

如何在 50,000 个 HTML 页面中找到电话号码?

Jeff Attwood 为申请工作的程序员发布了 5 个问题:

为了让电话筛查员的生活更简单,我整理了这份清单,列出了您在 SDE 筛查期间需要问的五个基本问题。他们不能保证你的候选人一定会很棒,但他们会帮助淘汰大量在我们今天的流程中溜走的候选人。

1) 编码考生必须使用 C、C++ 或 Java 编写一些具有正确语法的简单代码。

2) OO 设计候选人必须定义基本的OO 概念,并提出类来建模一个简单的问题。

3) 脚本和正则表达式考生必须描述如何在 50,000 个 HTML 页面中查找电话号码。

4) 数据结构候选人必须展示最常见数据结构的基本知识。

5) 位和字节考生必须回答有关位、字节和二进制数的简单问题。

请理解:我在这里寻找的是这些区域之一的完全真空。如果他们稍微挣扎一下然后弄清楚就可以了。如果他们需要一些小提示或提示也没关系。我不介意它们是否生锈或缓慢。您正在寻找的是对相关领域完全一无所知或极度困惑的候选人。

>>> Jeff 原帖的全部内容 <<<


注意: 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.xxxxxx
  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
egrep '\(?\d{3}\)?[-\s.]?\d{3}[-.]\d{4}' *.html
于 2008-09-07T21:36:54.083 回答
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 回答
1

Perl 解决方案

作者:“MH”,来自codinghorror,com,2008 年 9 月 5 日上午 7: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 );
于 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 回答