要匹配字母,这两个正则表达式是等价的吗?通常更可取吗?还是这是"视情况而定"的情况?
1.统一码字母短码:
p{L}
2.否定数字和空格的PCRE
短代码:
[^ds]
它们不等效。
假设您使用u
选项,p{L}
表示"字母(类别 L("。[^sd]
的意思是"不是空格(Z类(,也不是数字(Nd类("。如果每个角色确实都属于三个类别之一,那么你是对的,因为集合论,但有些字符不属于这三个类别中的任何一个。
例如,逗号,
是一个标点符号(类别 P(,将匹配[^sd]
,但不是p{L}
。
事实上,Unicode 中有超过3 个类别。
所以要实际使用否定来表示p{L}
,你必须说:
[^p{C}p{M}p{N}p{P}p{S}p{Z}]
基本上列出了所有其他类别。但是一旦Unicode决定添加一个新类别并且PCRE决定支持它,它就会中断。不用说,请不要在生产:)中使用它
两个正则表达式之间的对比是鲜明的:
正则表达式p{L}
匹配任何字母(因此L
(,不仅像w
那样匹配罗马和希腊字母,而且还匹配任何其他字母。
否定字符类[^ds]
匹配不是数字0-9
而不是制表符、换行符、垂直制表符、表单换行符、回车符、空格和可能的其他与区域设置相关的字符的任何内容。
因此,[^ds]
比仅匹配一种字符类型的p{L}
更强大,匹配的字符类型范围要大得多。