正则表达式——Unicode 匹配规则

本文详细解析了正则表达式在不同编码(ASCII与Unicode)下的匹配规则,特别是Unicode模式下d、w、s的扩展含义及在多种编程语言中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  一般来说,数字字符解释[0-9],单词字符就是[0-9a-zA-Z_],空白字符则包括空格、回车等字符,但这是 ASCII 编码中的情况,在 Unicode 编码中并非如此。

  因为包括了多种语言和字符,所以在 Unicode 编码中,全角数字0、1、2之类也算作“数字字符”,可以由\d匹配;中文字符,也可以算作“单词字符”,由\w匹配;同样的道理,中文的全角空格(码值为30 ff),也可以算作“空白字符”,由\s匹配。所以,如果在 Python 2 中指定了正则表达式使用 Unicode 模式(最简单的方式解释在正则表达式的开头指定模式修饰符(?u)),\d\w\s就能匹配全角数字、中文字符、全角空格。对于这种情况,本书中称为 Unicode 匹配规则;相应地,之前 ASCII 编码中的匹配,称为 ASCII 匹配规则

962172-20181213163301122-891340181.png

Unicode 模式下\d、\w、\s的匹配

简记法ASCII 匹配规则Unicode 匹配规则
\w[0-9a-zA-Z_][\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Lm}\p{Nd}\p{Pc}]
\d[0-9][\p{Nd}]
\s\t,\n,\v,\f,\r,\x20[\f\n\r\t\v\x85\p{Z}]

  注:\p{L}表示任意语言中的字母字符(包括英文字母和汉字);

    \p{M}表示用来与其他字符结合的字符(声调、元音变化符等);

    \p{Nd}表示任何书写系统中的 0~9 字符,汉字全角字符1、2等也算;

    \p{N1}表示形如字符的数字,比如罗马数字;

    \p{Pc}表示类似下划线之类的字符;

    \p{InEnclosedAlphanumerics}表示被包围的数字或字符,比如①

    \p{L}表示任意语言中的字母字符(包括英文字母和汉字);

  有时候,这样的规定确实让人抓狂:假设你希望用正则表达式\d{6,12}来验证一个长度在 6 到 12 之间的数字字符串,却没有留意\d能匹配全角数字,验证就可能出错;所以,一定要注意此类问题。

常用语言中的匹配规则

语言字符组简记法的匹配规则
.NET默认采用 Unicode 匹配规则,但可以显示指定采用 ASCII 匹配规则
JavaASCII 匹配规则
JavascriptASCII 匹配规则
PHPASCII 匹配规则
Python 2默认采用 ASCII 匹配规则,但可以显示指定采用 Unicode 匹配规则
Python 3默认采用 Unicode 匹配规则,但可以显示指定采用 ASCII 匹配规则
Ruby 1.8默认采用 ASCII 匹配规则,显示指定 Unicode 模式之后,只有\w使用 Unicode 匹配规则
Ruby 1.9Unicode 匹配规则

  注1:一般来说,单词边界\b能匹配的位置是:一端是单词字符,一端不是单词字符(也可以什么都没有),其中单词字符的规定与\w一样。Java 中则不是这样,它的细节比较复杂,以后再说。

  注2:在Python 3 中可以在表达式最开始用(?a)指定 ASCII 模式。

  注3:本书中说的 Ruby 1.9 指的是 Ruby 1.9.1 及以上版本,并不包含 Ruby 1.9.0,因为这个版本使用非常少,而且有一些非常奇怪的表现。

转载于:https://www.cnblogs.com/gaara0305/p/10114813.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值