\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}
更强大,可以匹配更大范围的字符类型。
为了匹配字母,这两个正则表达式是否等价?一个通常更可取吗?或者这是“视情况而定”的情况?
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}
更强大,可以匹配更大范围的字符类型。