Regex и регистр символов - PullRequest
       45

Regex и регистр символов

0 голосов
/ 12 августа 2010

Хорошо, я получил довольно простой (по крайней мере, кажется простым). У меня есть многослойная строка, и я просто играю с заменой разных слов чем-то другим. Позвольте мне показать вам ...

#!/usr/bin/perl -w
use strict;

$_ = "That is my coat.\nCoats are very expensive.";
s/coat/Hat/igm;
print;

Выход будет
That is my Hat
Hats are very expensive...

"Шапка" в первой строке не должна начинаться с заглавной буквы. Есть ли какие-то хитрости, которые могут сделать корпус совместимым с тем, как написан английский? Спасибо:)

Ответы [ 4 ]

5 голосов
/ 12 августа 2010
4 голосов
/ 12 августа 2010

Вы можете использовать модификатор e для s///, чтобы сделать трюк:

s/(coat)/ucfirst($1) eq $1 ? 'Hat' : 'hat'/igme;
1 голос
/ 12 августа 2010

Для одного вы должны использовать \b (граница слова), чтобы соответствовать только всему слову. Например, s/hat/coat/ изменится That на Tcoat без начального \b. Теперь на ваш вопрос. С флагом /e вы можете использовать Perl-код в заменяющей части регулярного выражения. Таким образом, вы можете написать функцию Perl, которая проверяет регистр совпадений и затем правильно устанавливает регистр замены:

my $s = "That is my coat.\nCoats are very expensive.";
$s =~ s/(\bcoat)/&same_case($1, "hat")/igme;
print $s, "\n";

sub same_case {
        my ($match, $replacement) = @_;

        # if match starts with uppercase character, apply ucfirst to replacement
        if($match =~ /^[A-Z]/) {
                return ucfirst($replacement);
        }
        else {
                return $replacement;
        }
}

Печать:

That is my hat.
Hats are very expensive.
0 голосов
/ 12 августа 2010

Это может решить вашу проблему:


#!/usr/bin/perl -w

use strict;

sub smartSubstitute {
    my $target = shift;
    my $pattern = shift;
    my $replacement = shift;

    $pattern = ucfirst $pattern;
    $replacement = ucfirst $replacement;

    $target =~ s/$pattern/$replacement/gm;

    $pattern = lcfirst $pattern;
    $replacement = lcfirst $replacement;

    $target =~ s/$pattern/$replacement/gm;

    return $target;
}

my $x = "That is my coat.\nCoats are very expansive.";
my $y = smartSubstitute($x, "coat", "Hat");
print $y, "\n";
...