在正则表达式中,有没有一种方法可以指定一个带有特定变音符号的字符匹配?例如,重音符号。做这件事的长方法是去维基百科上查看重音符号页面,复制它显示的所有字符,然后将它们制作成一个字符类:
/[àầằèềḕìǹòồṑùǜừẁỳ]/i
这相当繁琐。我原本希望能够使用Unicode属性,例如\p{hasGraveAccent}
,但是我找不到类似的东西。搜索解决方案只会显示那些试图匹配字符而忽略变音符号的人们提出的问题,这需要执行某种规范化过程,这不是我想要的。
在正则表达式中,有没有一种方法可以指定一个带有特定变音符号的字符匹配?例如,重音符号。做这件事的长方法是去维基百科上查看重音符号页面,复制它显示的所有字符,然后将它们制作成一个字符类:
/[àầằèềḕìǹòồṑùǜừẁỳ]/i
这相当繁琐。我原本希望能够使用Unicode属性,例如\p{hasGraveAccent}
,但是我找不到类似的东西。搜索解决方案只会显示那些试图匹配字符而忽略变音符号的人们提出的问题,这需要执行某种规范化过程,这不是我想要的。
有一些限制,但是可以实现。
#!perl
use strict;
use warnings;
use Encode;
use Unicode::Normalize;
use charnames qw();
use utf8; # source is utf-8
binmode(STDOUT, ":utf8"); # print in utf-8
my $utf8_string = 'xàaâèaêòͤ';
my $nfd_string = NFD($utf8_string); # decompose
my @chars_with_grave = $nfd_string =~
m/
(
\p{L} # one letter
\p{M}* # 0 or more marks
\N{COMBINING GRAVE ACCENT}
\p{M}* # 0 or more marks
)
/xmsg;
print join(', ',@chars_with_grave), "\n";
这将打印
$ perl utf_match_grave.pl
à, è, òͤ
注意:编辑区中的字符正确地显示为组合形式,但stackoverflow会错误地将它们分开显示。
需要一个字母作为基字符。更改正则表达式以适用于其他基字符。标记\p{M}
可能不完全符合您的要求,需要改进。
....\x00\x00\x03\x00
。从那里,您需要提取它所在的符文位置。这可以使用不同的方法完成,具体取决于您使用的编码方式。
所以如果你落在4的除数上,你就知道它是一个有效的字符。
除此之外,没有官方的Perl字符分组来做到这一点。
以下是Perl代码示例:
use Encode;
use Unicode::Normalize;
$StartUTF8='xàaâèaê';
$PerlEncoded=decode('utf8', $StartUTF8);
$PerlNormalized=NFD($PerlEncoded);
$UTF32Normalized=encode('utf32', $PerlNormalized);
while($UTF32Normalized =~ /(....\x00\x00\x03\x00)/gs) {
$Pos=pos($UTF32Normalized)-8;
if($Pos%4==0) {
print("$Pos\n");
}
}
但是此时,你可能只是在字符上执行for循环 :-\
我还尝试过使用//c进行匹配而不需要位置测试,但出于某种原因它不起作用。
/^(?:....)*?(....\x00\x00\x03\x00)/gcs