PERL -Заменить любой не буквенно-цифровой символ на "_" - PullRequest
1 голос
/ 08 марта 2011

В Perl я хочу заменить любой символ не [A-Z]i или [0-9] и заменить его на «_», но только если этот не буквенно-цифровой символ встречается между двумя буквенно-цифровыми символами. Я не хочу касаться не алфавитно-цифровых символов в начале или конце строки.

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

Ответы [ 2 ]

4 голосов
/ 08 марта 2011
s/(\p{Alnum})\P{Alnum}(\p{Alnum})/${1}_${2}/g;

Конечно, это повредит вашим изменениям с "# A # B% C", поэтому вы можете использовать осмотры:

s/(?<=\p{Alnum})\P{Alnum}(?=\p{Alnum})/_/g;

Таким образом, вы изолируете его только от символа "alnum".

Или вы также можете использовать «флаг сохранения» и сделать то же самое.

s/\p{Alnum}\K\P{Alnum}(?=\p{Alnum})/_/g;

РЕДАКТИРОВАТЬ на основе ввода:

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

s/\p{Alnum}\K[^\p{Alnum}\n](?=\p{Alnum})/_/g;
1 голос
/ 08 марта 2011

Попробуйте это:

my $str = 'a-2=c+a()_';
$str =~ s/(?<=[A-Z0-9])[^A-Z0-9](?=[A-Z0-9])/\1_\2/gi;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...