Как я могу заменить определенный символ его заглавной буквы? - PullRequest
4 голосов
/ 13 октября 2011

Рассмотрим следующую строку

String = "это для теста. Я новичок в Perl! Пожалуйста, помогите. Вы можете помочь? Я надеюсь на это."

В приведенной выше строке после . или ? или ! следующий символ должен быть в верхнем регистре. как я могу это сделать?

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

Ваша помощь будет принята с благодарностью.

Ответы [ 4 ]

12 голосов
/ 13 октября 2011

вы можете использовать регулярное выражение попробуйте это:

my $s = "...";
$s =~ s/([\.\?!]\s*[a-z])/uc($1)/ge; # of course $1 , thanks to plusplus

g-flag ищет все совпадения, а e-flag выполняет uc для преобразования буквы в верхний регистр

Пояснение:

  • с помощью [. \ ?!] вы ищете знаки препинания
  • \ s * - для пробелов между знаками и первой буквой вашего следующего слова и
  • [a-z] соответствует одной букве (в данном случае первое слово следующего слова

регулярное выражение, упомянутое выше, ищет с помощью этих шаблонов каждый знак препинания, за которым следуют (необязательные) пробелы и буквы, и заменяет его результатом uc (который преобразует совпадение в верхний регистр).

Например:

my $s = "this is for test. i'm new to perl! Please help. can u help? i hope so.";
$s =~ s/([\.\?!]\s*[a-z])/uc(&1)/ge;
print $s;

найдет ". I", "! P", ". C" и "? I" и заменит их, поэтому результат печати будет:

this is for test. I'm new to perl! Please help. Can u help? I hope so.
2 голосов
/ 13 октября 2011

Вы можете использовать оператор подстановки s///:

   $string =~ s/([.?!]\s*\S)/ uc($1) /ge;
1 голос
/ 13 октября 2011

Вот решение split:

$str = "this is for test. im new to perl! Please help. can u help? i hope so."; 
say join "", map ucfirst, split /([?!.]\s*)/, $str;

Если все, что вы делаете, - это печать в новый файл, вам не нужно присоединять строку обратно.Например,

while ($line = <$input>) {
    print $output map ucfirst, split /([?!.]\s*)/, $line;
}
0 голосов
/ 13 октября 2011

edit - полностью неверно истолковал вопрос, подумал, что по какой-то причине вы просто просили прописные буквы i, извиняюсь за путаницу!

Как показывают ответы, вы можете посмотреть на регулярные выражения и оператор подстановки (s///). Никто не упомянул символ \b (граница слова), который может быть полезен для поиска одиночных i s - в противном случае вам придется продолжать добавлять знаки препинания, которые вы находите, к соответствию класса символов ( [ ... ]).

1010 *, например *

my $x = "this is for test. i'm new to perl! Please help. can u help? i hope so. ".
       \"i want it to work!\". Dave, Bob, Henry viii and i are friends. foo i bar.";

$x =~ s/\bi\b/I/g;  # or could use the capture () and uc($1) in eugene's answer

дает:

# this is for test. I'm new to perl! Please help. can u help? I hope so. 
# "I want it to work!". Dave, Bob, Henry viii and I are friends. foo I bar.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...