我正在尝试匹配一个字符串,使最左边的符号和最右边的符号相同。我该怎么做?
答案 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
再次,只需替换您可接受的符号