使用正则表达式匹配perl中最右边和最左边的符号

时间:2012-03-17 22:23:51

标签: regex perl

我正在尝试匹配一个字符串,使最左边的符号和最右边的符号相同。我该怎么做?

4 个答案:

答案 0 :(得分:2)

如果不澄清你认为的“符号”,就不可能确切地知道你的意思,但这是一个可能的解决方案:

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 :(得分:1)

$string =~ m/^(.).*\1$/

应该有效。但是,这无法匹配长度为1的字符串。

答案 2 :(得分:1)

为什么要使用正则表达式执行此操作?是作业吗?我避免像这样的琐碎模式的正则表达式。

 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 )

答案 3 :(得分:0)

这些正则表达式的匹配字符串长度为1或更大。在表达式中,(.)表示一个捕获组,其中点应该用我的符号类替换(参见Unicode guru的,尽管这似乎不是问题的意图)。

此正则表达式的上下文是单行(/s修饰符)。它允许点匹配 新行以及其他任何内容(例如[\s\S]),因此可以嵌入新行,也可以作为最外层的行。

使用\z$/s模式)相同,但\z更正$在换行符之前可能匹配的情况(匹配)在字符串的末尾更常见)。如果有问题的字符是换行符并且您使用非贪婪量词(如.*?)且目标字符串为“\ nasdf \ n \ n”,则它可能会在最终换行符之前进行错误匹配。但这是一个没有实际意义的问题,因为这场比赛都很贪婪。不过,请留意他们。[/ p>

/^(?=(.)).*\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 

再次,只需替换您可接受的符号