Регулярное выражение для получения первой буквы слова после символов пунктуации в Perl - PullRequest
1 голос
/ 17 октября 2011

Может ли любое тело сказать мне регулярное выражение в Perl для получения самой первой буквы слова, идущего после точки, вопроса или восклицательного знака ...

Моя программа читает строку символ за символом.

Требование:

input string : "abcd[.?!]\s*abcd"
output: "Abcd[.?!]\s*Abcd"

Моя программа выглядит следующим образом:

#!/usr/bin/perl

use strict;

my $str = <STDIN>;
my $len=length($str);
my $ch;

my $i;
for($i=0;$i<=length($str);$i++)
{
$ch = substr($str,$i,1);
print "$ch";
if($ch =~ 's/([.?!]\s*[a-z])/uc($1)/ge')
{
    $i=$i+1;
    $ch = substr($str, $i,1);
    my $ch = uc($ch);
    print "$ch";
}
#elsif($ch eq "?")
#{
#   $i=$i+1;
#   $ch = substr($str, $i,1);
#   my $ch = uc($ch);
#   print "$ch";
#}
#elsif($ch eq "!")
#{
#   $i=$i+1;
#   $ch = substr($str, $i,1);
#   my $ch = uc($ch);
#   print"$ch";
#}
#elsif($ch eq " ")
#{
#   $i=$i+1;
#   $ch = substr($str, $i,1);
#   my $ch = uc($ch);
#   print"$ch";
#}
#else
#{
#print "";
#}
}
print "\n";

Ответы [ 4 ]

1 голос
/ 17 октября 2011

Цикл по строке, а затем цикл по совпадению, полностью излишним. Вся ваша программа может быть заменена следующим:

perl -pe 's/(^|[.?!]\s*)([a-z])/$1\U\2/g' inputfile >outputfile

Я добавил начало строки в первое выражение в скобках, хотя ваше объяснение не включает это (но ваш пример включает).

0 голосов
/ 17 октября 2011

Если у вас есть строка Unicode, вы можете использовать:

$str =~ s/(\pP|^)(\s*\pL)/$1\U$2/g;
0 голосов
/ 17 октября 2011

Обычно

$s =~ s/(?<=[.?!]|^)\s*[a-z]/\U$1/g;

$s =~ s/(?<![^.?!])\s*[a-z]/\U$1/g;

$s =~ s/(?:^|[.?!])\s*\K[a-z]/\U$1/g;

Но если вы читаете только один символ за раз,

my $after_punc = 1;
while (my $ch = ...) {
    if ($ch =~ /^[.?!]\z/) {
       $after_punc = 1;
    }
    elsif ($ch =~ /^[a-z]\z/) {
       $ch = uc($ch) if $after_punc;
       $after_punc = 0;
    }
    elsif ($ch =~ /^\s\z/) {
       # Ignore whitespace.
    }
    else {
       $after_punc = 0;
    }

    ...
}
0 голосов
/ 17 октября 2011

может ли любое тело сказать мне регулярное выражение в perl для получения самой первой буквы слова, приходящего после точки, вопроса или восклицательного знака ...

Моя программа читает строку символ за символом.

Требование:

входная строка: "abcd [.?!] \ S * abcd"

вывод: "Abcd [.?!] \ S * Abcd"

Ваш вывод не соответствует вашему объяснению. На входе начальное «а» не следует за точкой, вопросительным знаком или восклицательным знаком, но было изменено на верхний регистр.

Вы можете и должны выполнять такую ​​обработку с помощью одной замены. Чтобы сделать именно так, как вы сказали:

s/[.?!]\K[[:lower:]]/uc($&)/ge

\K отбрасывает символ, соответствующий [.?!], Оставляя только строчную букву в соответствующей строке. $& соответствует строке. Флаг e указывает на оценку uc($&).

Если вы также хотите сделать заглавную букву заглавной:

s/(?:^|[.?!])\K[[:lower:]]/uc($&)/ge
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...