Ответ 1
egrep "(([0-9]{1,2}.)?[0-9]{3}.[0-9]{3}.[0-9]{4})" . -R --include='*.html'
Jeff Attwood опубликовал 5 вопросов для программистов, подающих заявки на задания:
Чтобы сделать жизнь проще для телефонов, я собрал вместе этот список из пяти основных вопросов что вам нужно спросить во время SDE экран. Они не гарантируют, что ваш кандидат будет замечательным, но они будут помочь устранить огромное количество кандидатов, которые наш процесс сегодня.
1) Кодирование Кандидат должен написать некоторый простой код, с правильным синтаксисом, в C, С++ или Java.
2) Дизайн OO Кандидат должен определить основные концепции ОО и придумать с классами для моделирования простого проблема.
3) Сценарии и регулярные выражениякандидат должен описать, как найти номера телефонов в 50 000 HTML страницы.
4) Структуры данных Кандидат продемонстрировать базовые знания наиболее распространенные структуры данных.
5) Биты и байты Кандидат чтобы ответить на простые вопросы о битах, байты и двоичные числа.
Пожалуйста, поймите: что я ищу здесь имеется полный вакуум в одном из эти области. Это нормально, если они борются немного, а затем понять это. Это Хорошо, если им нужны небольшие подсказки или побуждая. Я не против, если они ржавый или медленный. Что вы ищете являются кандидатами, которые полностью невежественный или ужасно смущенный, о область, о которой идет речь.
Примечание: Стив Игге изначально задал вопрос.
egrep "(([0-9]{1,2}.)?[0-9]{3}.[0-9]{3}.[0-9]{4})" . -R --include='*.html'
Сделано на 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 Я не пытаюсь использовать лучший дизайн здесь. Просто реализовал алгоритм для этого.
Вот улучшенный шаблон регулярного выражения
\(?\d{3}\)?[-\s\.]?\d{3}[-\s\.]?\d{4}
Он способен идентифицировать несколько форматов чисел
egrep '(?\d {3})? [-\s.]?\d {3} [-.]\d {4}' *.html
Заимствуя 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
По: "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 );
Я люблю делать эти маленькие проблемы, не могу помочь себе.
не уверен, стоит ли это делать, так как он очень похож на 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;
}
Вот почему вопросы по кодированию телефонного интервью не работают:
phone screener: как вы находите номера телефонов на 50 000 HTML-страницах?
кандидат: на одну секунду (покрывает телефон) hey (roommate/friend/etc, который отлично разбирается в программировании), как вы находите номера телефонов на 50 000 HTML-страницах?
Сохраните вопросы, связанные с кодированием, на раннем этапе собеседования и сделайте собеседование более личными, т.е. "Мне бы хотелось получить подробные сведения о последнем решении проблемы с помощью кода". Это вопрос, который будет вызывать последующие действия по их деталям, и намного сложнее заставить кого-то другого ответить на него за вас, не зная странных по телефону.