You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL 17.1正则表达式疑问:特殊字符匹配与转义规则

PostgreSQL正则表达式疑问解答

两个DELETE语句的正则表达式区别

  1. 语句1的正则逻辑
    ^[\u2611-\uffffff]+$ 中的 \u 是PostgreSQL正则的Unicode转义标识,\u2611 对应Unicode字符U+2611(勾选符号),\uffffff 对应U+FFFFF(Unicode辅助平面字符)。整个正则表示匹配完全由U+2611到U+FFFFF范围内Unicode字符组成的行,符合你原本想删除含符号、非英文内容的需求。

  2. 语句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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:13:11