【发布时间】:2020-06-21 12:02:15
【问题描述】:
为了匹配字母,这两个正则表达式是等价的吗?一个通常更可取吗?或者这是“视情况而定”的情况?
1.Unicode字母短代码:
\p{L}
2.否定PCRE数字和空格的短代码:
[^\d\s]
【问题讨论】:
为了匹配字母,这两个正则表达式是等价的吗?一个通常更可取吗?或者这是“视情况而定”的情况?
1.Unicode字母短代码:
\p{L}
2.否定PCRE数字和空格的短代码:
[^\d\s]
【问题讨论】:
它们不相等。
假设您使用u 选项,\p{L} 表示“字母(L 类)”。 [^\s\d] 表示“不是空格(类别 Z),也不是数字(类别 Nd)”。 如果每个角色确实属于这三个类别之一,那么由于集合论,您是对的,但是有些角色不属于这三个类别中的任何一个类别。
例如,逗号, 是一个标点符号(P 类),将与[^\s\d] 匹配,而不是\p{L}。
In fact, there are a lot more than 3 categories in Unicode.
所以要实际使用否定来表示\p{L},你必须说:
[^\p{C}\p{M}\p{N}\p{P}\p{S}\p{Z}]
基本上列出所有其他类别。但是一旦 Unicode 决定添加一个新类别并且 PCRE 决定支持它,它就会中断。不用说,请不要在生产中使用它:)
【讨论】:
两个正则表达式之间的对比是鲜明的:
正则表达式\p{L} 匹配任何字母(因此是L),不仅像\w 那样匹配罗马和希腊字母,还匹配任何其他字母。
否定字符类[^\d\s] 匹配任何不是数字0-9 并且不是制表符、换行符、垂直制表符、换页符、回车符、空格和其他可能与语言环境相关的内容字符。
因此,[^\d\s] 比仅匹配一种字符类型的 \p{L} 更强大,匹配范围更广的字符类型。
【讨论】: