2010-01-27 3 views
3

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

Input: ([Ll])ocation 
Output: \1abel 

Это заменяет Location с Label и location с label. Однако, если я хочу заменить location на geocode и Location с Geocode, могу ли я сделать это с одним регулярным выражением?

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

+1

Не было бы проще сделать два отдельных чувствительных к регистру замещения? – SLaks

ответ

1

Здесь вы:

#!/usr/bin/perl -w 

$str1 = 'Location Loc10'; 
$str2 = 'location Loc10'; 

$str1 =~ s/(L(?{ $g = 'G'; }) | l(?{ $g = 'g'; }))ocation/${g}eocode/x; 
print "$str1\n"; # prints Geocode Loc10 

$str2 =~ s/(L(?{ $g = 'G'; }) | l(?{ $g = 'g'; }))ocation/${g}eocode/x; 
print "$str2\n"; # prints geocode Loc10 

нотабене Этот фрагмент кода использует экспериментальное выражение для оценки любого утверждения Perl-кода с нулевой шириной. Это только потому, что вы спросили об этом, я бы не рекомендую использовать такие выражения, гораздо лучше сделать несколько замен. И я действительно сомневаюсь, что Notepad ++ поддерживает его.

0

В Perl'е:

echo Location | perl -pe 's/(l)ocation/$1^lc($1)^"geocode"/ei' 
Geocode 
1

EditPad Pro будет делать, если вы выберете опцию "Adapt Case" при замене. Это не функция регулярных выражений, а просто функция, которая поддерживается некоторыми инструментами, которые выполняют поиск и замену. Упомянутые инструменты обычно питаются от регулярных выражений, но это не требуется; на самом деле, я не думаю, что регулярные выражения будут очень полезны при реализации такой функции.