Печать слов с заглавными буквами в Perl с использованием регулярных выражений

#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";

Я ввел многострочный модификатор, потому что я не могу сказать, что вы используете для разделителя строк.