Perl регулярное выражение заменить в том же случае - PullRequest
7 голосов
/ 08 июня 2011

Если у вас есть простое регулярное выражение, замените его в perl следующим образом:

($line =~ s/JAM/AAA/g){

как бы я изменил его так, чтобы он смотрел на совпадение и делал замену в том же регистре, что и совпадение, например:

«JAM» станет «AAA», а «jam» станет «aaa»

Ответы [ 4 ]

4 голосов
/ 08 июня 2011

Решение на основе Unicode:

use Unicode::UCD qw(charinfo);
my %category_mapping = (
    Lu  # upper-case Letter
        => 'A',
    Ll  # lower-case Letter
        => 'a',
);

join q(), map { $category_mapping{charinfo(ord $_)->{category}} } split //, 'jam';
# returns aaa

join q(), map { $category_mapping{charinfo(ord $_)->{category}} } split //, 'JAM';
# returns AAA

Здесь необработанные символы соотв. их категории немного легче увидеть, чем в других ответах.

3 голосов
/ 08 июня 2011

В Perl 5 вы можете сделать что-то вроде:

$line =~ s/JAM/$_=$&; tr!A-Z!A!; tr!a-z!a!; $_/gie;

Он обрабатывает все различные случаи JAM, например, Jam, и легко добавлять другие слова, например:

$line =~ s/JAM|SPAM/$_=$&; tr!A-Z!A!; tr!a-z!a!; $_/gie;
2 голосов
/ 08 июня 2011

Возможно, что-то вроде этого?

http://perldoc.perl.org/perlfaq6.html#How-do-I-substitute-case-insensitively-on-the-LHS-while-preserving-case-on-the-RHS%3f

Выполнение этого в два этапа, вероятно, является лучшей / более простой идеей ...

Использование возможностей GoogleЯ нашел это

The :samecase modifier, short :ii (since it's a variant of :i) preserve case.

    my $x = 'Abcd';
    $x ~~ s:ii/^../foo/;
    say $x;                     # Foocd
    $x = 'ABC'
    $x ~~ s:ii/^../foo/;
    say $x                      # FOO

This is very useful if you want to globally rename your module Foo, to Bar,
but for example in environment variables it is written as all uppercase.
With the :ii modifier the case is automatically preserved.
1 голос
/ 08 июня 2011
$line =~ s/JAM/{$& eq 'jam' ? 'aaa' : 'AAA'}/gie;
...