Perl регулярное выражение с восклицательными знаками - PullRequest
5 голосов
/ 16 февраля 2012

Как вы определяете / объясняете это регулярное выражение Perl:

$para =~ s!//!/!g;

Я знаю, s означает поиск, а g означает глобальный (поиск), но не уверен, как вписываются восклицательные знаки ! и дополнительные косые черты / (как я думал, шаблон будет выглядеть как s/abc/def/g).

Ответы [ 3 ]

10 голосов
/ 16 февраля 2012

Операторы регулярного выражения Perl s, m и tr (хотя на самом деле это не оператор регулярного выражения) позволяют использовать любой символ в качестве разделителя.

Это означает, что вы нет / вы можете использовать, как в вашем вопросе !

# the regex
s!//!/!g

означает поиск и замену всех экземпляров '//' на '/'

, которые вы можете написатьто же самое, что и

s/\/\//\/g 

или

s#//#/#g

или

s{//}{/}g

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

Более подробную информацию можно найти в perlre perldoc

4 голосов
/ 16 февраля 2012

Регулярное выражение подстановки (и другие операторы регулярных выражений, такие как m///) могут принимать любой символ пунктуации в качестве разделителя.Это избавит вас от необходимости избегать метасимволов внутри регулярного выражения.

Если вы хотите заменить косую черту, было бы неудобно написать:

s/\/\//\//g;

Именно поэтому вы можете написать

s!//!/!g; 

... вместо этого.См. http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators

И нет, s/// является заменой.m/// - это поиск, хотя я верю, что подразумеваемая мнемоника - "match".

1 голос
/ 16 февраля 2012

Восклицательные знаки являются разделителем; Perl позволяет вам выбрать любой символ в пределах разумного. Это утверждение эквивалентно (гораздо более уродливому) s/\/\//\//g - то есть оно заменяет // на /.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...