PostgreSQL 17.1正则表达式疑问:特殊字符匹配与转义规则
PostgreSQL正则表达式疑问解答
两个DELETE语句的正则表达式区别
语句1的正则逻辑
^[\u2611-\uffffff]+$中的\u是PostgreSQL正则的Unicode转义标识,\u2611对应Unicode字符U+2611(勾选符号),\uffffff对应U+FFFFF(Unicode辅助平面字符)。整个正则表示匹配完全由U+2611到U+FFFFF范围内Unicode字符组成的行,符合你原本想删除含符号、非英文内容的需求。语句2的正则逻辑
^[\2611-\uffffff]+$中的\261会被解析为八进制转义序列(PostgreSQL正则中,\后跟数字优先识别为八进制转义,最多取3位),八进制261对应ASCII的DEL字符(十进制177),剩下的1是普通字符'1'。后续的-作为范围分隔符,实际表示从字符'1'(U+0031)到U+FFFFF的所有字符。所以这个正则的匹配范围是:DEL字符 + 所有从'1'到U+FFFFF的字符组成的行,覆盖了纯数字、大部分符号、中文等大量内容,和语句1的目标范围完全不同。
误用语句2是否会误删重要数据?
肯定会。语句2会删除所有由数字('1'及以上)、中文、大部分符号、DEL字符组成的行,比如纯数字ID、包含数字的业务文本、中文内容等都会被误删,严重时会丢失大量重要数据。
转义序列的使用场景、范围及归属
\\unnnn(Unicode转义)
- 使用场景:需要匹配特定Unicode字符(如中文、emoji、特殊符号等)时使用,在PostgreSQL字符串中需写成
'\\uXXXX'(双反斜杠转义)。 - 范围:
nnnn是4位十六进制数,对应U+0000到U+FFFF的Unicode字符;若要表示U+10000以上的字符,需用\\U00XXXXXX(8位十六进制)。 - 归属:包含ASCII(U+0000-U+007F),其余为Unicode扩展字符。
\\xnn(十六进制转义)
- 使用场景:匹配ASCII/Latin-1范围内的字符(如控制字符、西欧特殊字符)时使用,字符串中需写成
'\\xXX'。 - 范围:
nn是2位十六进制数,对应十进制0-255(0x00-0xFF)的字符。 - 归属:0x00-0x7F属于ASCII,0x80-0xFF属于Latin-1(Unicode的子集)。
\\nnnn(八进制转义)
- 使用场景:匹配ASCII/Latin-1范围内的字符,常用于表示控制字符(如换行、DEL),字符串中需写成
'\\XXX'(最多3位八进制数)。 - 范围:取1-3位八进制数,对应十进制0-255(000-777)的字符。
- 归属:000-177(八进制,对应十进制0-127)属于ASCII,200-777(十进制128-255)属于Latin-1。
内容的提问来源于stack exchange,提问作者barak.o
相关产品推荐
相关产品推荐

