Винт регулярное выражение.
Использование регулярного выражения в данном случае создает проблему для решения, а не просто решает проблему.
Эта задача должна быть «легкой» даже для начинающего программиста, а новая идея регулярных выражений осквернила наш разум!
1: Get Input
2: Trim White Space
3: If this makes sence, trim out any 'bad' characters.
4: Use the "split" utility provided by your language to break it into words
5: Return the first 5 Words.
РАКЕТНАЯ НАУКА.
ответ
что вы имеете в виду ввернуть регулярное выражение? Вы, очевидно, программист VB.
Regex - самый эффективный способ работы со строками. Изучите их.
Нет. Php, немного поигравший с ruby, теперь безумно зацикливается на perl.
Есть некоторые вещи (например, в этом случае), когда основанная на регулярных выражениях альтернатива вычислительно и логически экспоненциально чрезмерно сложна для задачи.
Я анализирую все исходные файлы php с помощью regex, я не новичок в их использовании.
Но есть много случаев, таких как этот, когда вы используете лесозаготовительную компанию для обрезки вашего куста роз.
Конечно, я мог бы выполнять все шаги 2-5 с регулярным выражением, но они были бы простыми и атомарными, без странного синтаксиса обратного отслеживания или потенциала для рекурсивного поиска.
Перечисленные выше шаги с 1 по 5 имеют известную область действия, известный диапазон ввода, и нет никакой двусмысленности в том, как он функционирует. Что касается вашего регулярного выражения, то, что вы должны получить помощь от других, чтобы написать что-то настолько простое, доказывает это.
Я вижу, что кто-то отметил мой пост как оскорбительный, я несколько недоволен, я не могу отметить этот факт как оскорбительный для меня. ;)
Доказательство пудинга:
sub getNames{
my @args = @_;
my $text = shift @args;
my $num = shift @args;
# Trim Whitespace from Head/End
$text =~ s/^\s*//;
$text =~ s/\s*$//;
# Trim Bad Characters (??)
$text =~ s/[^a-zA-Z\'\s]//g;
# Tokenise By Space
my @words = split( /\s+/, $text );
#return 0..n
return @words[ 0 .. $num - 1 ];
} ## end sub getNames
print join ",", getNames " Hello world this is a good test", 5;
>> Hello,world,this,is,a
Если у кого-то есть что-то двусмысленное, как это работает, я буду рад объяснить это им. Заметил, что я все еще делаю это с регулярными выражениями. На других языках я бы использовал их родные функции «отделки», если это возможно.
Боллс ->
Я впервые попробовал этот подход. Это твой мозг на регулярных выражениях. Дети, не делайте регулярных выражений.
Это может быть хорошим началом
/([^\s]+
(\s[^\s]+
(\s[^\s]+
(\s[^\s]+
(\s[^\s]+|)
|)
|)
|)
)/
(зачеркнуто для ясности)
/([^\s]+(\s[^\s]+(\s[^\s]+(\s[^\s]+|)|)|))/
(факт)
Я использовал [^\s]+
здесь вместо вашей комбинации A-Z для краткости, но дело здесь во вложенных необязательных группах
т.е.:
(Hello( this( is( example))))
(Hello( this( is( example( two)))))
(Hello( this( is( better( example))))) three
(Hello( this( is()))))
(Hello( this()))
(Hello())
(Примечание: это, будучи запутанным, имеет преимущество, заключающееся в том, что оно сопоставит каждое имя с отдельной группой)
Если вы хотите читаемый код:
$word = '[^\s]+';
$regex = "/($word(\s$word(\s$word(\s$word(\s$word|)|)|)|)|)/";
(он привязывает к (захватить |) мантру "получить это или ничего не получить")