Сопоставление крайнего правого и левого символов в Perl с регулярным выражением - PullRequest
0 голосов
/ 18 марта 2012

Я пытаюсь сопоставить строку так, чтобы крайний левый символ и крайний правый символ совпадали.Как мне это сделать?

Ответы [ 4 ]

2 голосов
/ 18 марта 2012

Невозможно точно знать, что вы имеете в виду, без пояснения того, что вы считаете «символом», но вот одно из возможных решений:

use Unicode::Normalize;
NFD($string) =~ / \A \s* ( (?= \p{Grapheme_Base} ) \X ) .* \1 \s* \z /sx;

а вот еще:

use Unicode::Normalize;
NFD($string) =~ / \A \s* ( (?= \p{Symbol} ) \X ) .* \1 \s* \z /sx;

и вот еще один:

use Unicode::Normalize;
NFD($string) =~ / \A \s* ( (?: (?= \p{Symbol} ) \X )+ ) .* \1 \s* \z /sx;

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

$string =~ / ^ (\pS) .* \1 $ /xs;

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

1 голос
/ 18 марта 2012

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

 use Unicode::Normalize qw(NFC);
 $s = NFC( $s );

 substr( $s, 0, 1 ) eq substr( $s, -1, 1 );

Поскольку Том будет жаловаться на символы по сравнению с графемами, вы можете справиться и с этим:

 use v5.10.1;
 use Unicode::GCString;
 use Unicode::Normalize qw(NFC);

 my $gcs = Unicode::GCString->new( NFC( $s ) );
 $gcs->substr( 0, 1 ) eq $gcs->substr( -1, 1 )
1 голос
/ 18 марта 2012
$string =~ m/^(.).*\1$/

должно работать. Однако это не соответствует строкам длины 1.

0 голосов
/ 18 марта 2012

Строки соответствия этих регулярных выражений длиной 1 и более.В выражениях (.) представляет группу захвата, где точка должна быть заменена вашим классом символов, я полагаю (см. Гуру Unicode, хотя это не является целью вопроса).

контекст этого регулярного выражения - одна строка (модификатор /s).Это позволяет точке соответствовать символам новой строки, а также чему-либо еще (например, [\s\S]), чтобы можно было вставлять символы новой строки, а также быть самым удаленным из них.

Использование \z аналогично $ (в режиме /s), за исключением того, что \z исправляет сценарий, в котором $ может соответствовать перед новой строкой (совпадения в конце строки более распространены).Если рассматриваемый символ является символом новой строки, и вы используете не жадный квантификатор (например, .*?), а целевой строкой является «\ nasdf \ n \ n», он может ошибочно совпадать перед последним символом новой строки.Но это спорный вопрос, так как спички все жадные.Тем не менее, оставьте это для улыбок.

/^(?=(.)).*\1\z/s  

расширенный

/
 ^           # Beginning of string
 (?=(.))     # Lookahead - capture grp1, first (any) character (but don't consume it)
 .*          # Optionally consume all the characters up until before the last character
 \1          # Backreference to capture grp1, this must exist
 \z          # End of string
/s    # s modifier

Пример, предусматривающий только символы класса слов

/^(?=(\w)).*\1\z/s 

Опять же, просто замените ваши приемлемые символы

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