\p{L} 是否等同于 [^\d\s]

Is \p{L} equivalent to [^\d\s]

为了匹配字母,这两个正则表达式是否等价?一个通常更可取吗?或者这是“视情况而定”的情况?

1.Unicode字母短码:

\p{L}

2.Negated PCRE 数字和空格的短代码:

[^\d\s]

它们不等价。

假设您使用 u 选项,\p{L} 表示“字母(类别 L)”。 [^\s\d] 表示“不是空格(Z 类),也不是数字(Nd 类)”。 如果每个字符确实属于这三个类别之一,那么你是对的,因为集合论,但有些字符不属于这三个类别中的任何一个。

例如逗号,标点符号(类别P),将被[^\s\d]匹配,但不会被[=12=匹配].

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 可以,但也可以是任何其他字母表。

否定字符 class [^\d\s] 匹配任何 不是 数字 0-9 也不是制表符、换行符、垂直制表符、换页符、回车符 return、space 和可能的其他区域设置相关字符。

因此,[^\d\s] 比只匹配一种字符的 \p{L} 更强大,可以匹配更大范围的字符类型。