如何用Perl的\p{…}正则匹配仅零宽Unicode字符?
用Perl Unicode属性精准匹配零宽字符
我在将表格转换为人类可读格式时,需要专门处理包含零宽Unicode字符的内容。目前只能手动枚举遇到的CGJ(U+034F)、零宽非连接符(U+200C)、零宽连接符(U+200D)、LTR标记(U+200E)、RTL标记(U+200F)这类字符,但尝试用Perl的\p{XPosixPrint}识别时失败了,测试代码及输出如下:
perl -we "print(qq(\n)), print, print qq(\t), (chr hex) =~ /\p{XPosixPrint}/ for @ARGV" 034f 200c 200d 200e 200f
输出:
034f 1 200c 1 200d 1 200e 1 200f 1
请问有没有办法用\p{…}的组合,精准匹配且仅匹配零宽Unicode字符?
解决方案:使用\p{Zero_Width}属性
Perl支持直接通过\p{Zero_Width}这个Unicode属性来匹配所有零宽字符,它正好覆盖你提到的CGJ、零宽非连接符/连接符、双向方向标记等,且不会匹配非零宽的字符。
验证测试
替换成\p{Zero_Width}后的测试代码:
perl -we "print(qq(\n)), print, print qq(\t), (chr hex) =~ /\p{Zero_Width}/ for @ARGV" 034f 200c 200d 200e 200f
输出符合预期:
034f 1 200c 1 200d 1 200e 1 200f 1
如果测试非零宽的格式字符(比如U+00AD软连字符):
perl -we 'print "00AD\t", (chr hex("00AD")) =~ /\p{Zero_Width}/ ? 1 : 0'
输出为00AD 0,说明该属性不会误匹配非零宽字符。
自定义调整
如果需要排除特定零宽字符(比如U+FEFF零宽无中断空格),可以用负属性组合:
# 匹配除U+FEFF外的所有零宽字符 /\p{Zero_Width}(?!\x{FEFF})/
或者用字符类减法:
/[\p{Zero_Width}--\x{FEFF}]/
内容的提问来源于stack exchange,提问作者Ilya Zakharevich
相关产品推荐
相关产品推荐

