#regex #perl
#регулярное выражение #perl
Вопрос:
Я попытался создать алгоритм в Perl для печати только слов, в которых только первая буква является заглавной. Для примера:
Hey
now
Brown cow
Он должен печатать:
Hey
Brown
Но это печать:
Hey
Brown cow
Вот мой код:
while (<>) {
if (/^[A-Z][a-z] /) {
print;
}
}
print "n"
Ответ №1:
В данный момент вы печатаете строки, начинающиеся с заглавного слова.
Чтобы печатать слова, вам нужно настроить регулярное выражение так, чтобы оно либо записывало слова:
while (<>) {
while (/b([A-Z][a-z] )/g) {
print $1, "n";
}
}
Или начните с отдельных слов, а затем отфильтруйте заглавные:
while (<>) {
for (grep /^[A-Z]/, split) {
print $_, "n";
}
}
Комментарии:
1. О, спасибо!! Это сработало. Я пробовал
/b([A-Z][a-z] )/
, без буквы «g» в конце, но это не сработало.2.Допустим, у меня есть:
Hey
now
Brown Cow
как мне сделать так, чтобы результат был:Hey
Brown
Это означает, что он печатает только слова с первой буквой cpaital и только одно слово, соответствующее правилам в строке?3. Для первого решения мы бы изменили while на if:
if (/b([A-Z][a-z] )/) {
. Для второго решения мы бы изменили for на if:if (my ($match) = grep /^[A-Z]/, split) { print "$matchn" }
Ответ №2:
Ваше регулярное выражение вам не лжет. Оно соответствует слову с заглавной буквы, но затем вы продолжаете и печатаете всю строку.
Если вы хотите печатать только совпадающие слова, то должно сработать следующее:
my @words;
while (<>) {
@words = split(/s /);
foreach my $word (@words) {
print if (/^[A-Z][a-z] /);
}
}
Ответ №3:
Должно работать следующее:
while ( /b([A-Z][a-z]*)b/g ) { print $1 . $/; }
Начиная с начала границы слова ( b
), нам требуется ровно одна заглавная буква ( [A-Z]
). Чтобы завершить слово, мы допускаем любое количество строчных букв ( [a-z]*
), пока не дойдем до конца word ( b
) .
Комментарии:
1. Ах, я пропустил «только первую букву». Исправлен ответ.
2. не жадничайте
*
🙂3. @Paulchenkiller Быть жадным здесь нормально. Нежадность необходима, когда больше полагаешься на граничное условие, а не ограничиваешь то, что разрешено для сопоставления с использованием символьного класса.
Ответ №4:
Ваше регулярное выражение предлагает заглавные слова в начале строки. Это также предполагает, что вы не рассматриваете I
слово. Учитывая интересующие вас символы, вы могли бы исправить это с помощью —
/^[A-Z](?i:[a-z])*/m and print $amp;,"n";
Я ввел многострочный модификатор, потому что я не могу сказать, что вы используете для разделителя строк.