目錄 搜尋
前言 何为PostgreSQL? PostgreSQL简史 格式约定 更多信息 臭虫汇报指导 I. 教程 章1. 从头开始 1.1. 安装 1.2. 体系基本概念 1.3. 创建一个数据库 1.4. 访问数据库 章2. SQL语言 2.1. 介绍 2.2. 概念 2.3. 创建新表 2.4. 向表中添加行 2.5. 查询一个表 2.6. 表间链接 2.7. 聚集函数 2.8. 更新 2.9. 删除 章3. 高级特性 3.1. 介绍 3.2. 视图 3.3. 外键 3.4. 事务 3.5. 窗口函数 3.6. 继承 3.7. 结论 II. SQL语言 章4. SQL语法 4.1. 词法结构 4.2. 值表达式 4.3. 调用函数 章5. 数据定义 5.1. 表的基本概念 5.2. 缺省值 5.3. 约束 5.4. 系统字段 5.5. 修改表 5.6. 权限 5.7. 模式 5.8. 继承 5.9. 分区 5.10. 其它数据库对象 5.11. 依赖性跟踪 章 6. 数据操作 6.1. 插入数据 6.2. 更新数据 6.3. 删除数据 章7. 查询 7.1. 概述 7.2. 表表达式 7.3. 选择列表 7.4. 组合查询 7.5. 行排序 7.6. LIMIT和OFFSET 7.7. VALUES列表 7.8. WITH的查询(公用表表达式) 章8. 数据类型 8.1. 数值类型 8.2. 货币类型 8.3. 字符类型 8.4. 二进制数据类型 8.5. 日期/时间类型 8.6. 布尔类型 8.7. 枚举类型 8.8. 几何类型 8.9. 网络地址类型 8.10. 位串类型 8.11. 文本搜索类型 8.12. UUID类型 8.13. XML类型 8.14. 数组 8.15. 复合类型 8.16. 对象标识符类型 8.17. 伪类型 章 9. 函数和操作符 9.1. 逻辑操作符 9.2. 比较操作符 9.3. 数学函数和操作符 9.4. 字符串函数和操作符 9.5. 二进制字符串函数和操作符 9.6. 位串函数和操作符 9.7. 模式匹配 9.8. 数据类型格式化函数 9.9. 时间/日期函数和操作符 9.10. 支持枚举函数 9.11. 几何函数和操作符 9.12. 网络地址函数和操作符 9.13. 文本检索函数和操作符 9.14. XML函数 9.15. 序列操作函数 9.16. 条件表达式 9.17. 数组函数和操作符 9.18. 聚合函数 9.19. 窗口函数 9.20. 子查询表达式 9.21. 行和数组比较 9.22. 返回集合的函数 9.23. 系统信息函数 9.24. 系统管理函数 9.25. 触发器函数 章10. 类型转换 10.3. 函数 10.2. 操作符 10.1. 概述 10.4. 值存储 10.5. UNION 章11. 索引 11.1. 介绍 11.2. 索引类型 11.3. 多字段索引 11.4. 索引和ORDER BY 11.5. 组合多个索引 11.6. 唯一索引 11.7. 表达式上的索引 11.8. 部分索引 11.9. 操作类和操作簇 11.10. 检查索引的使用 章12. Full Text Search 12.1. Introduction 12.2. Tables and Indexes 12.3. Controlling Text Search 12.4. Additional Features 12.5. Parsers 12.6. Dictionaries 12.7. Configuration Example 12.8. Testing and Debugging Text Search 12.9. GiST and GIN Index Types 12.10. psql Support 12.11. Limitations 12.12. Migration from Pre-8.3 Text Search 章13. 并发控制 13.1. 介绍 13.2. 事务隔离 13.3. 明确锁定 13.4. 应用层数据完整性检查 13.5. 锁和索引 章14. 性能提升技巧 14.1. 使用EXPLAIN 14.2. 规划器使用的统计信息 14.3. 用明确的JOIN语句控制规划器 14.4. 向数据库中添加记录 14.5. 非持久性设置 III. 服务器管理 章15. 安装指导 15.1. 简版 15.2. 要求 15.3. 获取源码 15.4. 升级 15.5. 安装过程 15.6. 安装后的设置 15.7. 支持的平台 15.8. 特殊平台的要求 章16. Installation from Source Code on Windows 16.1. Building with Visual C++ or the Platform SDK 16.2. Building libpq with Visual C++ or Borland C++ 章17. 服务器安装和操作 17.1. PostgreSQL用户帐户 17.2. 创建数据库集群 17.3. 启动数据库服务器 17.4. 管理内核资源 17.5. 关闭服务 17.6. 防止服务器欺骗 17.7. 加密选项 17.8. 用SSL进行安全的TCP/IP连接 17.9. Secure TCP/IP Connections with SSH Tunnels 章18. 服务器配置 18.1. 设置参数 18.2. 文件位置 18.3. 连接和认证 18.4. 资源消耗 18.5. 预写式日志 18.6. 查询规划 18.7. 错误报告和日志 18.8. 运行时统计 18.9. 自动清理 18.10. 客户端连接缺省 18.12. 版本和平台兼容性 18.11. 锁管理 18.13. 预置选项 18.14. 自定义的选项 18.15. 开发人员选项 18.16. 短选项 章19. 用户认证 19.1. pg_hba.conf 文件 19.2. 用户名映射 19.3. 认证方法 19.4. 用户认证 章20. 数据库角色和权限 20.1. 数据库角色 20.2. 角色属性 20.3. 权限 20.4. 角色成员 20.5. 函数和触发器 章21. 管理数据库 21.1. 概述 21.2. 创建一个数据库 21.3. 临时库 21.4. 数据库配置 21.5. 删除数据库 21.6. 表空间 章22. 本土化 22.1. 区域支持 22.2. 字符集支持 章23. 日常数据库维护工作 23.1. Routine Vacuuming日常清理 23.2. 经常重建索引 23.3. 日志文件维护 章24. 备份和恢复 24.1. SQL转储 24.2. 文件系统级别的备份 24.3. 在线备份以及即时恢复(PITR) 24.4. 版本间迁移 章25. 高可用性与负载均衡,复制 25.1. 不同解决方案的比较 25.2. 日志传送备份服务器 25.3. 失效切换 25.4. 日志传送的替代方法 25.5. 热备 章26. 恢复配置 26.1. 归档恢复设置 26.2. 恢复目标设置 26.3. 备服务器设置 章27. 监控数据库的活动 27.1. 标准Unix工具 27.2. 统计收集器 27.3. 查看锁 27.4. 动态跟踪 章28. 监控磁盘使用情况 28.1. 判断磁盘的使用量 28.2. 磁盘满导致的失效 章29. 可靠性和预写式日志 29.1. 可靠性 29.2. 预写式日志(WAL) 29.3. 异步提交 29.4. WAL配置 29.5. WAL内部 章30. Regression Tests 30.1. Running the Tests 30.2. Test Evaluation 30.3. Variant Comparison Files 30.4. Test Coverage Examination IV. 客户端接口 章31. libpq-C库 31.1. 数据库联接函数 31.2. 连接状态函数 31.3. 命令执行函数 31.4. 异步命令处理 31.5. 取消正在处理的查询 31.6. 捷径接口 31.7. 异步通知 31.8. 与COPY命令相关的函数 31.9. Control Functions 控制函数 31.10. 其他函数 31.11. 注意信息处理 31.12. 事件系统 31.13. 环境变量 31.14. 口令文件 31.15. 连接服务的文件 31.16. LDAP查找连接参数 31.17. SSL支持 31.18. 在多线程程序里的行为 31.19. 制作libpq程序 31.20. 例子程序 章32. 大对象 32.1. 介绍 32.2. 实现特点 32.3. 客户端接口 32.4. 服务器端函数 32.5. 例子程序 章33. ECPG - Embedded SQL in C 33.1. The Concept 33.2. Connecting to the Database Server 33.3. Closing a Connection 33.4. Running SQL Commands 33.5. Choosing a Connection 33.6. Using Host Variables 33.7. Dynamic SQL 33.8. pgtypes library 33.9. Using Descriptor Areas 33.10. Informix compatibility mode 33.11. Error Handling 33.12. Preprocessor directives 33.13. Processing Embedded SQL Programs 33.14. Library Functions 33.15. Internals 章34. 信息模式 34.1. 关于这个模式 34.2. 数据类型 34.3. information_schema_catalog_name 34.4. administrable_role_authorizations 34.5. applicable_roles 34.6. attributes 34.7. check_constraint_routine_usage 34.8. check_constraints 34.9. column_domain_usage 34.10. column_privileges 34.11. column_udt_usage 34.12. 字段 34.13. constraint_column_usage 34.14. constraint_table_usage 34.15. data_type_privileges 34.16. domain_constraints 34.18. domains 34.17. domain_udt_usage 34.19. element_types 34.20. enabled_roles 34.21. foreign_data_wrapper_options 34.22. foreign_data_wrappers 34.23. foreign_server_options 34.24. foreign_servers 34.25. key_column_usage 34.26. parameters 34.27. referential_constraints 34.28. role_column_grants 34.29. role_routine_grants 34.30. role_table_grants 34.31. role_usage_grants 34.32. routine_privileges 34.33. routines 34.34. schemata 34.35. sequences 34.36. sql_features 34.37. sql_implementation_info 34.38. sql_languages 34.39. sql_packages 34.40. sql_parts 34.41. sql_sizing 34.42. sql_sizing_profiles 34.43. table_constraints 34.44. table_privileges 34.45. tables 34.46. triggered_update_columns 34.47. 触发器 34.48. usage_privileges 34.49. user_mapping_options 34.50. user_mappings 34.51. view_column_usage 34.52. view_routine_usage 34.53. view_table_usage 34.54. 视图 V. 服务器端编程 章35. 扩展SQL 35.1. 扩展性是如何实现的 35.2. PostgreSQL类型系统 35.3. User-Defined Functions 35.4. Query Language (SQL) Functions 35.5. Function Overloading 35.6. Function Volatility Categories 35.7. Procedural Language Functions 35.8. Internal Functions 35.9. C-Language Functions 35.10. User-Defined Aggregates 35.11. User-Defined Types 35.12. User-Defined Operators 35.13. Operator Optimization Information 35.14. Interfacing Extensions To Indexes 35.15. 用C++扩展 章36. 触发器 36.1. 触发器行为概述 36.3. 用 C 写触发器 36.2. 数据改变的可视性 36.4. 一个完整的例子 章37. 规则系统 37.1. The Query Tree 37.2. 视图和规则系统 37.3. 在INSERT,UPDATE和DELETE上的规则 37.4. 规则和权限 37.5. 规则和命令状态 37.6. 规则与触发器得比较 章38. Procedural Languages 38.1. Installing Procedural Languages 章39. PL/pgSQL - SQL过程语言 39.1. 概述 39.2. PL/pgSQL的结构 39.3. 声明 39.4. 表达式 39.5. 基本语句 39.6. 控制结构 39.7. 游标 39.8. 错误和消息 39.9. 触发器过程 39.10. PL/pgSQL Under the Hood 39.11. 开发PL/pgSQL的一些提示 39.12. 从OraclePL/SQL 进行移植 章40. PL/Tcl - Tcl Procedural Language 40.1. Overview 40.2. PL/Tcl Functions and Arguments 40.3. Data Values in PL/Tcl 40.4. Global Data in PL/Tcl 40.5. Database Access from PL/Tcl 40.6. Trigger Procedures in PL/Tcl 40.7. Modules and the unknown command 40.8. Tcl Procedure Names 章41. PL/Perl - Perl Procedural Language 41.1. PL/Perl Functions and Arguments 41.2. Data Values in PL/Perl 41.3. Built-in Functions 41.4. Global Values in PL/Perl 41.6. PL/Perl Triggers 41.5. Trusted and Untrusted PL/Perl 41.7. PL/Perl Under the Hood 章42. PL/Python - Python Procedural Language 42.1. Python 2 vs. Python 3 42.2. PL/Python Functions 42.3. Data Values 42.4. Sharing Data 42.5. Anonymous Code Blocks 42.6. Trigger Functions 42.7. Database Access 42.8. Utility Functions 42.9. Environment Variables 章43. Server Programming Interface 43.1. Interface Functions Spi-spi-connect Spi-spi-finish Spi-spi-push Spi-spi-pop Spi-spi-execute Spi-spi-exec Spi-spi-execute-with-args Spi-spi-prepare Spi-spi-prepare-cursor Spi-spi-prepare-params Spi-spi-getargcount Spi-spi-getargtypeid Spi-spi-is-cursor-plan Spi-spi-execute-plan Spi-spi-execute-plan-with-paramlist Spi-spi-execp Spi-spi-cursor-open Spi-spi-cursor-open-with-args Spi-spi-cursor-open-with-paramlist Spi-spi-cursor-find Spi-spi-cursor-fetch Spi-spi-cursor-move Spi-spi-scroll-cursor-fetch Spi-spi-scroll-cursor-move Spi-spi-cursor-close Spi-spi-saveplan 43.2. Interface Support Functions Spi-spi-fname Spi-spi-fnumber Spi-spi-getvalue Spi-spi-getbinval Spi-spi-gettype Spi-spi-gettypeid Spi-spi-getrelname Spi-spi-getnspname 43.3. Memory Management Spi-spi-palloc Spi-realloc Spi-spi-pfree Spi-spi-copytuple Spi-spi-returntuple Spi-spi-modifytuple Spi-spi-freetuple Spi-spi-freetupletable Spi-spi-freeplan 43.4. Visibility of Data Changes 43.5. Examples VI. 参考手册 I. SQL命令 Sql-abort Sql-alteraggregate Sql-alterconversion Sql-alterdatabase Sql-alterdefaultprivileges Sql-alterdomain Sql-alterforeigndatawrapper Sql-alterfunction Sql-altergroup Sql-alterindex Sql-alterlanguage Sql-alterlargeobject Sql-alteroperator Sql-alteropclass Sql-alteropfamily Sql-alterrole Sql-alterschema Sql-altersequence Sql-alterserver Sql-altertable Sql-altertablespace Sql-altertsconfig Sql-altertsdictionary Sql-altertsparser Sql-altertstemplate Sql-altertrigger Sql-altertype Sql-alteruser Sql-alterusermapping Sql-alterview Sql-analyze Sql-begin Sql-checkpoint Sql-close Sql-cluster Sql-comment Sql-commit Sql-commit-prepared Sql-copy Sql-createaggregate Sql-createcast Sql-createconstraint Sql-createconversion Sql-createdatabase Sql-createdomain Sql-createforeigndatawrapper Sql-createfunction Sql-creategroup Sql-createindex Sql-createlanguage Sql-createoperator Sql-createopclass Sql-createopfamily Sql-createrole Sql-createrule Sql-createschema Sql-createsequence Sql-createserver Sql-createtable Sql-createtableas Sql-createtablespace Sql-createtsconfig Sql-createtsdictionary Sql-createtsparser Sql-createtstemplate Sql-createtrigger Sql-createtype Sql-createuser Sql-createusermapping Sql-createview Sql-deallocate Sql-declare Sql-delete Sql-discard Sql-do Sql-dropaggregate Sql-dropcast Sql-dropconversion Sql-dropdatabase Sql-dropdomain Sql-dropforeigndatawrapper Sql-dropfunction Sql-dropgroup Sql-dropindex Sql-droplanguage Sql-dropoperator Sql-dropopclass Sql-dropopfamily Sql-drop-owned Sql-droprole Sql-droprule Sql-dropschema Sql-dropsequence Sql-dropserver Sql-droptable Sql-droptablespace Sql-droptsconfig Sql-droptsdictionary Sql-droptsparser Sql-droptstemplate Sql-droptrigger Sql-droptype Sql-dropuser Sql-dropusermapping Sql-dropview Sql-end Sql-execute Sql-explain Sql-fetch Sql-grant Sql-insert Sql-listen Sql-load Sql-lock Sql-move Sql-notify Sql-prepare Sql-prepare-transaction Sql-reassign-owned Sql-reindex Sql-release-savepoint Sql-reset Sql-revoke Sql-rollback Sql-rollback-prepared Sql-rollback-to Sql-savepoint Sql-select Sql-selectinto Sql-set Sql-set-constraints Sql-set-role Sql-set-session-authorization Sql-set-transaction Sql-show Sql-start-transaction Sql-truncate Sql-unlisten Sql-update Sql-vacuum Sql-values II. 客户端应用程序 App-clusterdb App-createdb App-createlang App-createuser App-dropdb App-droplang App-dropuser App-ecpg App-pgconfig App-pgdump App-pg-dumpall App-pgrestore App-psql App-reindexdb App-vacuumdb III. PostgreSQL服务器应用程序 App-initdb App-pgcontroldata App-pg-ctl App-pgresetxlog App-postgres App-postmaster VII. 内部 章44. PostgreSQL内部概览 44.1. 查询路径 44.2. 连接是如何建立起来的 44.3. 分析器阶段 44.4. ThePostgreSQL规则系统 44.5. 规划器/优化器 44.6. 执行器 章45. 系统表 45.1. 概述 45.2. pg_aggregate 45.3. pg_am 45.4. pg_amop 45.5. pg_amproc 45.6. pg_attrdef 45.7. pg_attribute 45.8. pg_authid 45.9. pg_auth_members 45.10. pg_cast 45.11. pg_class 45.12. pg_constraint 45.13. pg_conversion 45.14. pg_database 45.15. pg_db_role_setting 45.16. pg_default_acl 45.17. pg_depend 45.18. pg_description 45.19. pg_enum 45.20. pg_foreign_data_wrapper 45.21. pg_foreign_server 45.22. pg_index 45.23. pg_inherits 45.24. pg_language 45.25. pg_largeobject 45.26. pg_largeobject_metadata 45.27. pg_namespace 45.28. pg_opclass 45.29. pg_operator 45.30. pg_opfamily 45.31. pg_pltemplate 45.32. pg_proc 45.33. pg_rewrite 45.34. pg_shdepend 45.35. pg_shdescription 45.36. pg_statistic 45.37. pg_tablespace 45.38. pg_trigger 45.39. pg_ts_config 45.40. pg_ts_config_map 45.41. pg_ts_dict 45.42. pg_ts_parser 45.43. pg_ts_template 45.44. pg_type 45.45. pg_user_mapping 45.46. System Views 45.47. pg_cursors 45.48. pg_group 45.49. pg_indexes 45.50. pg_locks 45.51. pg_prepared_statements 45.52. pg_prepared_xacts 45.53. pg_roles 45.54. pg_rules 45.55. pg_settings 45.56. pg_shadow 45.57. pg_stats 45.58. pg_tables 45.59. pg_timezone_abbrevs 45.60. pg_timezone_names 45.61. pg_user 45.62. pg_user_mappings 45.63. pg_views 章46. Frontend/Backend Protocol 46.1. Overview 46.2. Message Flow 46.3. Streaming Replication Protocol 46.4. Message Data Types 46.5. Message Formats 46.6. Error and Notice Message Fields 46.7. Summary of Changes since Protocol 2.0 47. PostgreSQL Coding Conventions 47.1. Formatting 47.2. Reporting Errors Within the Server 47.3. Error Message Style Guide 章48. Native Language Support 48.1. For the Translator 48.2. For the Programmer 章49. Writing A Procedural Language Handler 章50. Genetic Query Optimizer 50.1. Query Handling as a Complex Optimization Problem 50.2. Genetic Algorithms 50.3. Genetic Query Optimization (GEQO) in PostgreSQL 50.4. Further Reading 章51. 索引访问方法接口定义 51.1. 索引的系统表记录 51.2. 索引访问方法函数 51.3. 索引扫描 51.4. 索引锁的考量 51.5. 索引唯一性检查 51.6. 索引开销估计函数 章52. GiST Indexes 52.1. Introduction 52.2. Extensibility 52.3. Implementation 52.4. Examples 52.5. Crash Recovery 章53. GIN Indexes 53.1. Introduction 53.2. Extensibility 53.3. Implementation 53.4. GIN tips and tricks 53.5. Limitations 53.6. Examples 章54. 数据库物理存储 54.1. 数据库文件布局 54.2. TOAST 54.3. 自由空间映射 54.4. 可见映射 54.5. 数据库分页文件 章55. BKI后端接口 55.1. BKI 文件格式 55.2. BKI命令 55.3. 系统初始化的BKI文件的结构 55.4. 例子 章56. 规划器如何使用统计信息 56.1. 行预期的例子 VIII. 附录 A. PostgreSQL错误代码 B. 日期/时间支持 B.1. 日期/时间输入解析 B.2. 日期/时间关键字 B.3. 日期/时间配置文件 B.4. 日期单位的历史 C. SQL关键字 D. SQL Conformance D.1. Supported Features D.2. Unsupported Features E. Release Notes Release-0-01 Release-0-02 Release-0-03 Release-1-0 Release-1-01 Release-1-02 Release-1-09 Release-6-0 Release-6-1 Release-6-1-1 Release-6-2 Release-6-2-1 Release-6-3 Release-6-3-1 Release-6-3-2 Release-6-4 Release-6-4-1 Release-6-4-2 Release-6-5 Release-6-5-1 Release-6-5-2 Release-6-5-3 Release-7-0 Release-7-0-1 Release-7-0-2 Release-7-0-3 Release-7-1 Release-7-1-1 Release-7-1-2 Release-7-1-3 Release-7-2 Release-7-2-1 Release-7-2-2 Release-7-2-3 Release-7-2-4 Release-7-2-5 Release-7-2-6 Release-7-2-7 Release-7-2-8 Release-7-3 Release-7-3-1 Release-7-3-10 Release-7-3-11 Release-7-3-12 Release-7-3-13 Release-7-3-14 Release-7-3-15 Release-7-3-16 Release-7-3-17 Release-7-3-18 Release-7-3-19 Release-7-3-2 Release-7-3-20 Release-7-3-21 Release-7-3-3 Release-7-3-4 Release-7-3-5 Release-7-3-6 Release-7-3-7 Release-7-3-8 Release-7-3-9 Release-7-4 Release-7-4-1 Release-7-4-10 Release-7-4-11 Release-7-4-12 Release-7-4-13 Release-7-4-14 Release-7-4-15 Release-7-4-16 Release-7-4-17 Release-7-4-18 Release-7-4-19 Release-7-4-2 Release-7-4-20 Release-7-4-21 Release-7-4-22 Release-7-4-23 Release-7-4-24 Release-7-4-25 Release-7-4-26 Release-7-4-27 Release-7-4-28 Release-7-4-29 Release-7-4-3 Release-7-4-30 Release-7-4-4 Release-7-4-5 Release-7-4-6 Release-7-4-7 Release-7-4-8 Release-7-4-9 Release-8-0 Release-8-0-1 Release-8-0-10 Release-8-0-11 Release-8-0-12 Release-8-0-13 Release-8-0-14 Release-8-0-15 Release-8-0-16 Release-8-0-17 Release-8-0-18 Release-8-0-19 Release-8-0-2 Release-8-0-20 Release-8-0-21 Release-8-0-22 Release-8-0-23 Release-8-0-24 Release-8-0-25 Release-8-0-26 Release-8-0-3 Release-8-0-4 Release-8-0-5 Release-8-0-6 Release-8-0-7 Release-8-0-8 Release-8-0-9 Release-8-1 Release-8-1-1 Release-8-1-10 Release-8-1-11 Release-8-1-12 Release-8-1-13 Release-8-1-14 Release-8-1-15 Release-8-1-16 Release-8-1-17 Release-8-1-18 Release-8-1-19 Release-8-1-2 Release-8-1-20 Release-8-1-21 Release-8-1-22 Release-8-1-23 Release-8-1-3 Release-8-1-4 Release-8-1-5 Release-8-1-6 Release-8-1-7 Release-8-1-8 Release-8-1-9 Release-8-2 Release-8-2-1 Release-8-2-10 Release-8-2-11 Release-8-2-12 Release-8-2-13 Release-8-2-14 Release-8-2-15 Release-8-2-16 Release-8-2-17 Release-8-2-18 Release-8-2-19 Release-8-2-2 Release-8-2-20 Release-8-2-21 Release-8-2-3 Release-8-2-4 Release-8-2-5 Release-8-2-6 Release-8-2-7 Release-8-2-8 Release-8-2-9 Release-8-3 Release-8-3-1 Release-8-3-10 Release-8-3-11 Release-8-3-12 Release-8-3-13 Release-8-3-14 Release-8-3-15 Release-8-3-2 Release-8-3-3 Release-8-3-4 Release-8-3-5 Release-8-3-6 Release-8-3-7 Release-8-3-8 Release-8-3-9 Release-8-4 Release-8-4-1 Release-8-4-2 Release-8-4-3 Release-8-4-4 Release-8-4-5 Release-8-4-6 Release-8-4-7 Release-8-4-8 Release-9-0 Release-9-0-1 Release-9-0-2 Release-9-0-3 Release-9-0-4 F. 额外提供的模块 F.1. adminpack F.2. auto_explain F.3. btree_gin F.4. btree_gist F.5. chkpass F.6. citext F.7. cube F.8. dblink Contrib-dblink-connect Contrib-dblink-connect-u Contrib-dblink-disconnect Contrib-dblink Contrib-dblink-exec Contrib-dblink-open Contrib-dblink-fetch Contrib-dblink-close Contrib-dblink-get-connections Contrib-dblink-error-message Contrib-dblink-send-query Contrib-dblink-is-busy Contrib-dblink-get-notify Contrib-dblink-get-result Contrib-dblink-cancel-query Contrib-dblink-get-pkey Contrib-dblink-build-sql-insert Contrib-dblink-build-sql-delete Contrib-dblink-build-sql-update F.9. dict_int F.10. dict_xsyn F.11. earthdistance F.12. fuzzystrmatch F.13. hstore F.14. intagg F.15. intarray F.16. isn F.17. lo F.18. ltree F.19. oid2name F.20. pageinspect F.21. passwordcheck F.22. pg_archivecleanup F.23. pgbench F.24. pg_buffercache F.25. pgcrypto F.26. pg_freespacemap F.27. pgrowlocks F.28. pg_standby F.29. pg_stat_statements F.30. pgstattuple F.31. pg_trgm F.32. pg_upgrade F.33. seg F.34. spi F.35. sslinfo F.36. tablefunc F.37. test_parser F.38. tsearch2 F.39. unaccent F.40. uuid-ossp F.41. vacuumlo F.42. xml2 G. 外部项目 G.1. 客户端接口 G.2. 过程语言 G.3. 扩展 H. The Source Code Repository H.1. Getting The Source Via Git I. 文档 I.1. DocBook I.2. 工具集 I.3. 制作文档 I.4. 文档写作 I.5. 风格指导 J. 首字母缩略词 参考书目 Bookindex Index
文字

9.7. 模式匹配

PostgreSQL提供了三种实现模式匹配的方法:传统SQLLIKE操作符、SQL99 新增的SIMILAR TO操作符、POSIX风格的正则表达式。另外还有一个模式匹配函数substring可用, 它可以使用SIMILAR TO风格或者POSIX风格的正则表达式。 除了基本" ?"操作符,函数可用于提取或替换匹配的子串和分隔匹配位置的字符串。

Tip: 如果你的模式匹配要求比这些还多,或者想写一些模式驱动的替换和转换,请考虑用Perl或Tcl写一个用户定义函数。

9.7.1. LIKE

stringLIKEpattern[ESCAPEescape-character]
stringNOT LIKEpattern[ESCAPEescape-character]

如果该string与所提供的pattern模式匹配, 那么LIKE表达式返回真。和我们想像的一样,如果LIKE返回真, 那么NOT LIKE表达式将返回假,反之亦然。一个等效的表达式 是NOT(stringLIKEpattern)

如果pattern不包含百分号或者下划线,那么该模式只代表它本身;这时候LIKE的行为就像等号操作符。 在pattern里的下划线(_)匹配任何单个字符;而一个百分号(%)匹配零或多个任何字符。

一些例子:

'abc' LIKE 'abc' true
'abc' LIKE 'a%'true
'abc' LIKE '_b_' true
'abc' LIKE 'c' false

LIKE模式匹配总是覆盖整个字符串。要匹配在字符串内部任何位置的序列,该模式必须以百分号开头和结尾。

要匹配下划线或者百分号本身,在pattern里相应的字符必须前导逃逸字符。 缺省的逃逸字符是反斜杠,但是你可以用ESCAPE子句指定一个。要匹配逃逸字符本身,写两个逃逸字符。

请注意反斜杠在字符串文本里已经有特殊含义了,所以如果你写一个包含反斜杠的模式常量, 那你就要在 SQL 语句里写两个反斜杠。因此,写一个匹配单个反斜杠的模式实际上要在语句里 写四个反斜杠。你可以通过用ESCAPE选择一个不同的逃逸字符来避免这样;这样反斜杠就 不再是LIKE的特殊字符了。(但仍然是字符文本分析器的特殊字符,所以你还是需要两个反斜杠。)

我们也可以通过写成ESCAPE ''的方式关闭逃逸机制,这时,我们就不能关闭下划线和百分号的特殊含义

关键字ILIKE可以用于替换LIKE, 令该匹配就当前的区域设置是大小写无关的。这个特性不是SQL标准, 是PostgreSQL扩展。

操作符~~等效于LIKE,而~~*等效于ILIKE。 还有!~~!~~*操作符分别 代表NOT LIKENOT ILIKE。所有这些操作符都是PostgreSQL特有的。

9.7.2. SIMILAR TO正则表达式

stringSIMILAR TOpattern[ESCAPEescape-character]
stringNOT SIMILAR TOpattern[ESCAPEescape-character]

SIMILAR TO根据自己的模式是否匹配给定字符串而返回真或假。 它和LIKE非常类似,只不过它使用 SQL 标准定义的正则表达式理解模式。 SQL 标准的正则表达式是在LIKE表示法和普通的正则表达式表示法之间古怪的交叉。

类似LIKE, theSIMILAR TO操作符只有在它的模式匹配整个字符串的时候才能成功; 这一点和普通的正则表达式的习惯不同,在普通的正则表达式里,模式匹配字符串的任意部分。 和LIKE类似的地方还有SIMILAR TO使用 _ 和 % 分别匹配单个字符和任意字符串(这些和 POSIX 正则表达式里的_%兼容)。

除了这些从 LIKE 借用的功能之外,SIMILAR TO支持下面这些从 POSIX 正则表达式借用的模式匹配元字符:

  • |表示选择(两个候选之一).

  • *表示重复前面的项零次或更多次

  • +表示重复前面的项一次或更多次

  • ? 表示重复前面的项零或一次。

  • {m} 表示重复前面的项,完全相同m次。

  • {m,} 表示重复前面的项m或更多次。

  • {mn} 表示重复前面的项至少m次,不超过n次。

  • 括号()可以作为项目分组到一个独立的逻辑项。

  • [...]声明一个字符类,就像POSIX正则表达式。

请注意之间的 (.)不是一个元字符而是SIMILAR TO

LIKE一样,反斜杠关闭所有这些元字符的特殊含义; 当然我们也可以用ESCAPE声明另外一个逃逸字符。

一些例子:

'abc' SIMILAR TO 'abc' true
'abc' SIMILAR TO 'a'   false
'abc' SIMILAR TO '%(b|d)%'true
'abc' SIMILAR TO '(b|c)%'false

三个参数的substring(string from pattern for escape-character)函数提供了 一个从字符串中抽取一个匹配 SQL 正则表达式模式的子字符串功能。和SIMILAR TO一样, 声明的模式必须匹配整个字符串,否则函数失效并返回 NULL 。为了标识在成功的时候应该返回的模式部分, 模式必须出现后跟双引号(")的两个逃逸字符。匹配这两个标记之间的模式的字符串将被返回。

一些例子,用#"分隔返回字符串:

substring('foobar' from '%#"o_b#"%' for '#')oob
substring('foobar' from '#"o_b#"%' for '#') NULL

9.7.3. POSIX正则表达式

Table 9-11列出了所可用的POSIX 正则表达式的模式匹配操作符

Table 9-11. 正则表达式匹配操作符

操作符 描述 示例
~ 匹配正则表达式,区分大小写 'thomas' ~ '.*thomas.*'
~* 匹配正则表达式,不分大小写 'thomas' ~* '.*Thomas.*'
!~ 不匹配正则表达式,区分大小写 'thomas' !~ '.*Thomas.*'
!~* 不匹配正则表达式,不分大小写 'thomas' !~* '.*vadim.*'

POSIX正则表达式提供了比LIKESIMILAR TO 操作符更强大的模式匹配的方法。许多 Unix 工具,比如egrepsedawk使用类似的模式匹配语言。

正则表达式是一个字符序列,它是定义一个字符串集合(一个正则集合)的缩写。 如果一个字符串是正则表达式描述的正则集合中的一员时,我们就说这个字符串匹配该正则表达式。 和LIKE一样,模式字符准确地匹配字符串字符,除非在正则表达式语言里有特殊 字符(不过正则表达式用的特殊字符和LIKE用的不同)。和LIKE不一样的是, 正则表达式可以匹配字符串里的任何位置,除非该正则表达式明确地锚定在字符串的开头或者结尾。

一些例子:

'abc' ~ 'abc' true
'abc' ~ '^a'true
'abc' ~ '(b|d)'true
'abc' ~ '^(b|c)'false

下面更详细描述POSIX模式匹配语言。

两个参数的substring(stringfrom pattern)函数提供了从字符串中抽取一个 匹配 POSIX 正则表达式模式的子字符串的方法。如果没有匹配它返回 NULL , 否则就是文本中匹配模式的那部分。但是如果该模式包含任何圆括弧,那么将返回匹配 第一对子表达式(对应第一个左圆括弧的)的文本。如果你想在表达式里使用圆括弧而又不想 导致这个例外,那么你可以在整个表达式外边放上一对圆括弧。 如果你需要在想抽取的子表达式前有圆括弧,参阅描述的非捕获性圆括弧。

一些例子:

substring('foobar' from 'o.b')oob
substring('foobar' from 'o(.)b')o

regexp_replace(sourcepatternreplacement [flags]) 函数提供了将匹配 POSIX 正则表达式模式的子字符串替换为新文本的功能。如果没有匹配pattern的子字符串, 那么返回不加修改的source字符串。如果有匹配,则返回的source字符串里面的对应子字符串 将被 replacement 字符串替换掉。replacement字符串可以包含\n, 这里的n19, 表明源字符串中匹配第n个圆括弧子表达式的部分将插入在该位置,并且它可以包含\&表示 应该插入匹配整个模式的字符串。如果你需要放一个文本反斜杠在替换文本里,那么写\\(和 通常一样,记得在文本常量字符串里写双反斜杠)。可选的flags参数包含零个或多个改变函数行为的单字母标记。 i表示进行大小写无关的匹配,g表示替换每一个匹配的子字符串而不仅仅是第一个。 其它支持的标记描述在Table 9-19。

一些例子:

regexp_replace('foobarbaz', 'b..', 'X')
                              fooXbaz
regexp_replace('foobarbaz', 'b..', 'X', 'g')
                              fooXX
regexp_replace('foobarbaz', 'b(..)', E'X\\1Y', 'g')
                              fooXarYXazY

regexp_matches函数返回一个所有匹配POSIX正则表达式的获取子串结果的text数组。使用语法 regexp_matches(stringpattern [flags])。这个函数可以返回没有行,一行,或者多行 (参阅下面的g标记)。如果pattern没有匹配,则函数返回没有行。 如果模式包含没有括号的子表达式,则每行返回的是单元素的文本数组,其中包含的子串相匹配整个模式。 如果模式包含括号的子表达式,函数返回一个文本数组,n的元素是子串匹配n括号子表达式内的模式。 (不计"非捕获"的括号);详细信息参阅下面的。 参数flags是一个选项text字符串,含有0或者更多单字母标记来改变函数行为。标记g导致查找字符串中的每个匹配, 而不仅是第一个,每个匹配返回一行,其它的标记支持描述在Table 9-19。

一些例子:

SELECT regexp_matches('foobarbequebaz', '(bar)(beque)');
 regexp_matches 
----------------
 {bar,beque}
(1 row)

SELECT regexp_matches('foobarbequebazilbarfbonk', '(b[^b]+)(b[^b]+)', 'g');
 regexp_matches 
----------------
 {bar,beque}
 {bazil,barf}
(2 rows)

SELECT regexp_matches('foobarbequebaz', 'barbeque');
 regexp_matches 
----------------
 {barbeque}
(1 row)

使用select子句,可能强制regexp_matches()总是返回一行; 在SELECT当你想要的所有行的目标列表返回,甚至不匹配的情况下,是有特别有用的。

SELECT col1, (SELECT regexp_matches(col2, '(bar)(beque)')) FROM tab;

regexp_split_to_table函数使用POSIX正则表达式作为分隔符,分隔字符串。 语法regexp_split_to_table(stringpattern [flags])。如果没有匹配pattern,函数将返回string。 如果有至少一个匹配,每个匹配返回从最后一个匹配结束(或者字符串的开头)到匹配开始的文本。 当没有更多的匹配,返回最后一个匹配的结束到字符串的结束的文本。 flags参数是一个选项text字符串,含有0或者更多单字母标记来改变函数行为。 regexp_split_to_table支持的标记描述在Table 9-19。

除了regexp_split_to_array 返回结果为text数组,regexp_split_to_array函数行为与regexp_split_to_table相同, 使用语法 regexp_split_to_array(stringpattern [flags])。 参数与regexp_split_to_table相同。

一些例子:

SELECT foo FROM regexp_split_to_table('the quick brown fox jumped over the lazy dog', E'\\s+') AS foo;
  foo   
--------
 the    
 quick  
 brown  
 fox    
 jumped 
 over   
 the    
 lazy   
 dog    
(9 rows)

SELECT regexp_split_to_array('the quick brown fox jumped over the lazy dog', E'\\s+');
              regexp_split_to_array             
------------------------------------------------
 {the,quick,brown,fox,jumped,over,the,lazy,dog}
(1 row)

SELECT foo FROM regexp_split_to_table('the quick brown fox', E'\\s*') AS foo;
 foo 
-----
 t         
 h         
 e         
 q         
 u         
 i         
 c         
 k         
 b         
 r         
 o         
 w         
 n         
 f         
 o         
 x         
(16 rows)

作为最后一个例子表明,在出现在字符串的开始或结束 或在紧接一前一后的匹配,正则表达式分隔函数忽略零长度匹配, 这样实现regexp_matches严格上来说是违背了的 正则表达式匹配的定义,但在实际使用中,通常是最便利的的行为。 如Perl等软件系统,使用了类似的定义。

9.7.3.1. 正则表达式细节

PostgreSQL的正则表达式使用 Henry Spencer 写的一个包来实现。 下面的大部分描述都是从他的手册页里逐字拷贝过来的。

正则表达式(REs),在POSIX1003.2中定义, 它有两种形式:扩展正则表达式extendedREs或 EREs(基本上就是在egrep里的那些), 基本正则表达式basicREs或 BREBREs(基本上就是在 eded里的那些)。 PostgreSQL支持这两种形式,也实现了一些POSIX 里面没有的,在 Perl 或Tcl 这样的语言中得到广泛应用的类似扩展。使用了那些非 POSIX 扩展的正则表达式叫 高级正则表达式advancedREs或AREs。 AREs几乎完全是EREs的超集,但是BREs有几个符号上的不兼容(以及更多的限制)。 我们首先描述AREs和EREs形式, 描述那些只适用于AREs的特性,然后描述与BREs的区别是什么。

Note: PostgreSQL总是初始化一个遵循ARE规则的正则表达式。然而对于RE模式,可以在 更多限制的ERE或BRE规则前面,选择一个embedded option,描述在Section 9.7.3.4。 这对于兼容期望完全POSIX1003.2规则的应用程序,是有用的。

一条正则表达式可以定义为一个或多个的分支,由|分隔。 它要匹配其中任何一个分支。

一个分支是0或多个限定的原子quantified atoms或约束constraints连接而成。 一个原子匹配第一个,后面的原子匹配第二个,依次类推。一个空的分支要匹配空字符串。

一个有限定的原子是一个原子atom,后面可能跟着一个界定符quantifier。没有界定符的时候, 它匹配一个原子,有界定符的时候,它可以匹配若干个原子。 原子的各种可能性,在atom在Table 9-12里面显示。可能的界定符和他们的含义在Table 9-13里显示。

一个约束constraint匹配一个空字符串, 但只是在满足特定条件下才匹配。约束可以在能够使用原子的地方使用, 只是它不能跟着界定符。简单的约束在Table 9-14里显示;稍后描述更多的约束。

Table 9-12. 正则表达式原子

原子 描述
(re) (re是任意正则表达式)匹配一个对 re 的匹配,有可报告的匹配信息。
(?:re) as above, but the match is not noted for reporting (a"non-capturing"set of parentheses) (AREs only) 同上,但是不会报告匹配信息(一个"非捕获"non-capturing""括号),只在 ARE 中有。
. 匹配任意单个字符
[chars] 一个方括弧表达式bracket expression,匹配chars中的任意字符 (参阅Section 9.7.3.2获取更多细节)。
\k (k是非字母数字字符)匹配一个当作普通字符看待的特定字符,比如\\匹配一个反斜杠。
\c c是一个字母数字(可能跟着其它字符),首项是逃逸符escape,参阅Section 9.7.3.3。 (仅在ARE 中;在 ERE 和 BRE 中,它匹配c)。
{ when followed by a character other than a digit, matches the left-brace character{; when followed by a digit, it is the beginning of a bound(see below) 如果后面跟着一个非数字字符,那么就 匹配左花括弧{;如果跟着一个数字,那么它是范围bound的开始(见下面)
x 这里的x是一个没有其它特征的单个字符,则匹配该字符。

RE不能以\结尾。

Note: 要记住反斜杠(\)在PostgreSQL字符串文本中已经有特殊含义了。 要写一个包含反斜杠的模式,你必须在语句里写两个反斜杠(参阅Section 4.1.2.1)。

Table 9-13. 正则表达式界定符

界定符 匹配
* 一个匹配0或更多个原子的序列
+ 一个匹配 1或更多个原子的序列
? 一个匹配0或1个原子的序列
{m} 一个正好匹配m个原子的序列
{m,} 一个匹配m个或者更多原子的序列
{mn} 一个匹配mn个(包含两端)原子的序列;m不能比n
*? *的非贪婪模式
+? +的非贪婪模式
?? ?的非贪婪模式
{m}? {m}的非贪婪模式
{m,}? {m,}的非贪婪模式
{mn}? {mn}的非贪婪模式

{...}的形式被称作范围bounds。 一个范围内的数字mn都是无符号十进制整数,允许的数值从 0 到 255 (闭区间)。

Non-greedy界定符(只在 ARE 中可用)匹配对应的正常(greedy)模式, 区别是它寻找最少的匹配,而不是最多的匹配。参阅Section 9.7.3.5获取更多细节。

Note: 一个界定符不能紧跟在另外一个界定符后面。例如,**是无效的。界定符不能是表达式或者子表达式的开头, 也不能跟在^|后面。

Table 9-14. 正则表达式约束

约束 描述
^ 匹配字符串的开头
$ 匹配字符串的结尾
正向预查positive lookahead在任何匹配re的字符串开始处匹配查找字符串(只在 ARE 中有)。  
(?!re) 负向预查negative lookahead在任何不匹配re的字符串开始处匹配查找字符串(只在 ARE 中有)。

预查约束不能包含后引用back references(参阅Section 9.7.3.3),并且在其中的所有圆括号都被认为是不捕获的。

9.7.3.2. 方括弧表达式

方括号表达式bracket expression是一个[]括起来的字符列表。它通常匹配任意单个列表中的 字符(又见下文)。如果列表以^开头,它匹配任意单个不在该列表中的字符。 如果该列表中两个字符用-隔开,那它就是那两个字符(包括在内)之间的所有字符范围的缩写, 比如,在ASCII[0-9]匹配查找任何十进制数字。两个范围共享一个终点是非法的, 比如a-c-e。这个范围与序列顺序关系密切,可移植的程序不应该依靠它们。

在列表中包含文本],可以让它做列表的首字符(可能会在一个^后面)。 在列表中包含文本-,可以让它做列表的首字符或者末字符,或者一个范围的第二个终点。 在列表中把文本-当做范围的起点,把它用[.and.]包围起来,这样它就成为一个 集合元素(见下文)。除了这些字符本身,和一些用[的组合(见下段), 以及逃逸(只在 ARE 中有效)以外,所有其它特殊字符在方括弧表达式里都失去它们的特殊含义。 特别是,在 ERE 和 BRE 规则下\不是特殊的,但在 ARE 里,它是特殊的(还是引入一个逃逸)。

在一个方括弧表达式里,一个集合元素(一个字符、一个当做一个字符的多字符序列、或者 一个表示上面两种情况的集合序列)包含在[..]里面的时候表示该集合元素的字符序列。 该序列是该方括弧列表的一个元素。因此一个包含多字符集合元素的方括弧表达式就可以 匹配多于一个字符,比如,如果集合序列包含一个ch集合元素,那么[[.ch.]]*c 匹配chchcc的头五个字符。 译注:其实把 [. 和 .] 括起来的整体当一个字符看就行了。

Note: PostgreSQL目前不支持多字节符集合元素。这些信息描述了将来可能有的行为。

在方括弧表达式里,在[==]括起来的集合元素是一个等价表, 代表等于这里所有集合元素的字符序列,包括它本身(如果没有其它等效集合元素, 那么就处理如同由[..].)的界定符。例如, 如果o^是一个等价类的成员, 那么[[=o=]][[=^=]][o^]都是同义的。一个等价表不能是一个范围的端点。

在方括弧表达式里,在[::]里面括起来的字符表名,代表属于该表的所有字符的列表。 标准的字符表名字是:alnumalphablankcntrldigitgraphlowerprintpunctspaceupperxdigit。它们代表 在ctype里定义的字符表。 本地化设置可能会提供其它的表。字符表不能用做一个范围的端点。

在方括弧表达式里有两个特例:方括弧表达式[[:<:]][[:>:]]是约束, 分别匹配一个单词开头和结束的空串。单词定义为一个单词字符序列,前面和后面 都没有其它单词字符。单词字符是一个alnum字符(和ctype) 里定义的一样)或者一个下划线。这是一个扩展,兼容POSIX1003.2 ,但那里面并没有说明,而且在准备移植到其它系统里去的软件里一定要小心使用。 通常下面描述的约束逃逸更好些(他们并非更标准,但是肯定更容易输入)。

9.7.3.3. 正则表达式逃逸

Escapes是以\开头,后面跟着一个字母数字字符的特殊序列。逃逸有好几种 变体:字符项、表缩写、约束逃逸、后引用。在 ARE 里,如果一个\后面跟着一个 字母数字,但是并未组成一个合法的逃逸,那么它是非法的。在 ERE 里则没有逃逸:在 方括弧表达式之外,一个跟着字母数字字符的\只是表示该字符是一个普通字符, 而在一个方括弧表达式里,\是一个普通的字符(后者实际上是 ERE 和 ARE 之间的不兼容)。

字符项逃逸Character-entry escapes用于方便我们声明正则表达式里那些不可打印和在RE里其它不方便的字符。 它们在Table 9-15里列出。

类缩写逃逸Class-shorthand escapes用来提供一些常用的字符类缩写。他们在Table 9-16里列出

约束逃逸constraint escape是一个约束,如果满足特定的条件,它匹配该空字符串,作为逃逸编写。 它们在Table 9-17里列出。

后引用back reference(\n)匹配数字n 指定前面圆括弧子表达式匹配的同一个字符串(参阅Table 9-18)。 例如,(([bc])\1匹配bbcc但是不匹配bccb。 正则表达式里的子表达式必须完全在后引用前面。非捕获圆括弧并不定义子表达式。

Note: 请记住,如果把模式当作一个 SQL 字符串常量输入,那么逃逸前导的\需要双倍地写。例如:

'123' ~ E'^\\d{3}'true

Table 9-15. 正则表达式字符项逃逸

逃逸 描述
\a 警笛(铃声)字符,和 C 里一样
\b 退格,和 C 里一样
\B \的同义词,用于减少反斜杠加倍的需要
\cX (这里X是任意字符)字符的低5位和X里的相同,其它位都是0。
\e 集合序列名字是ESC的字符,如果不是,则是八进制值为033的字符
\f 进纸,和C里一样
\n 新行,和C里一样
\r 回车,和C里一样
\t 水平制表符,和C里一样
\uwxyz (这里的wxyz是恰好四个十六进制数字)本机字节序的 UTF-16(宽字符,16位)字符U+wxyz
\Ustuvwxyz (wherestuvwxyzis exactly eight hexadecimal digits) reserved for a hypothetical Unicode extension to 32 bits (这里的stuvwxyz是恰好八个十六进制数字)为Unicode 32 位扩展预留的。
\v 垂直制表符,和 C 里一样
\xhhh (这里的hhh是一个十六进制序列)十六进制 值为0xhhh的字符(不管用了几个十六进制位,都是一个字符)。
\0 值为0的字符(空字节)
\xy (这里的xy是恰好两个八进制数字,并且不是一个back reference后引用)八进制值为0xy的字符
\xyz (这里的xyz是恰好三位八进制位,并且不是一个 后引用)八进制值为0xyz的字符

十六进制数字是0-9a-fA-F。八进制数字是0-7

字符项逃逸总是被当作普通字符。例如,\135是 ASCII 中的], 但\135并不结束一个方括弧表达式。

Table 9-16. 正则表达式类缩写逃逸

逃逸 描述
\d [[:digit:]]
\s [[:space:]]
\w [[:alnum:]_] (注意,这里是包含下划线的)
\D [^[:digit:]]
\S [^[:space:]]
\W [^[:alnum:]_] (注意,这里是包含下划线的)

在方括号表达式里,\d\s\w会失去他们的外层方括号,而\D\S\W是非法的。 比如[a-c\d]等效于[a-c[:digit:]]。 同样[a-c\D]原来等效于[a-c^[:digit:]]的,也是非法的。

Table 9-17. 正则表达式约束逃逸

逃逸 描述
\A 只匹配字符串开头(参阅Section 9.7.3.5获取它和^区别的信息)
\m 只匹配一个词的开头
\M 只匹配一个词的结尾
\y 只匹配一个词的开头或者结尾
\Y 只匹配那些既不是词的开头也不是词的结尾的点
\Z 只匹配一个字符串的结尾(参阅Section 9.7.3.5获取它和$区别的信息)

一个词的定义是上面[[:<:]][[:>:]]的声明。 在方括弧表达式里,约束逃逸是非法的。

Table 9-18. 正则表达式后引用

逃逸 描述
\m 这里的m是一个非零数字)一个指向第m个子表达式的后引用
\mnn (这里的m是一个非零数字,nn是更多的数字,并且十进制数值mnn 不能大于到这个位置为止的闭合捕获圆括号的个数)一个指向第 mnn 个子表达式的后引用。

Note: 在八进制字符项逃逸和后引用之间有一个历史继承的歧义存在,这个歧义是 通过启发分析解决的,像上面描述的那样。前导零总是表示这是一个八进制逃逸。 而单个非零数字,如果没有跟着任何其它数字,那么总是认为是后引用。 一个多数据位的非零开头的序列也认为是后引用(只要它在合适的子表达式后面, 也就是说,数值在后引用的合法范围内),否则就认为是一个八进制。

9.7.3.4. 正则表达式元语法

除了上面描述的主要语法之外,还有几种特殊形式和杂项语法。

正则表达式可以用两个特殊意义的director前缀其中之一。 如果一个正则表达式以***:开头,正则表达式其余部分,可以作为ARE。 (在正则表达式作为ARE后,这通常在PostgreSQL没有影响的;但是 如果在ERE或BRE模式指定一个flags参数给正则表达式函数,确实是有影响的。) 如果一个正则表达式以***=开头,正则表达式其余部分作为文本字符串, 所有字符串视为普通字符。

ARE可以用embedded options开头;一个序列(?xyz) (这里xyz是1个或更多个字母字符)特定的选项影响正则表达式的其余部分。 这些选项覆盖任何先前确定的选项 —尤其,他们可以覆盖正则表达式操作符或flags 给正则表达式函数的隐含区分大小写的行为。可用的字母选项显示在Table 9-19。 注意同样这些字母选项可以用作正则表达式函数的flags参数。

Table 9-19. ARE 嵌入选项字母

选项 描述
b 正则表达式的其余部分是BRE
c 大小写敏感匹配(覆盖操作符类型)
e 正则表达式的其余部分是 ERE
i 大小写不敏感匹配(参阅Section 9.7.3.5)(覆盖操作符类型)
m n的历史同义词
n 换行敏感匹配(参阅Section 9.7.3.5)
p 部分换行敏感匹配(参阅Section 9.7.3.5)
q 正则表达式的其余部分为一个文本("quoted")字符串,所有都是普通字符
s 非换行敏感匹配(缺省)
t 严格的语法(缺省,见下文)
w 反部分换行敏感("怪异""weird")匹配(参阅Section 9.7.3.5)
x 扩展的语法(见下文)

嵌入的选项在终止其序列的)发生作用。他们只在 ARE 的开始处起作用(即在任何***:引导符后面)。

除了通常情况下所有的选项字符都显然遵循(严格tight)正则表达式语法,还有 一种扩展expanded语法,可以通过声明嵌入的x选项使用。在扩展语法里, 正则表达式中的空白字符被忽略,就像那些在#和新行后(或正则表达式的结尾处)之间的所有字符一样。这样就允许 我们给一个复杂的正则表达式分段和注释。不过这个基本规则上有三种例外:

  • 前置了\的空白符或#保留

  • 在方括号表达式里的空白符或者#保留

  • 在多个字符符号里面不能出现空白和注释,比如(?:

在这里,空白是空白、水平制表符、换行、和任何属于space(空白)字符表的字符。

最后,在 ARE 里,方括号表达式外面,序列(?#ttt)(这里的ttt是任意不包含) 的文本)是一个注释,完全忽略掉。再次,在多字符符号里,不允许使用,例如(?:。这样的注释是比一个有用的工具更历史些, 他们的用法已经废弃了;我们应该使用扩展语法代替他。

如果声明了一个初始化的***=引导符,那么所有这些元语法扩展都不能使用, 因为这样表示把用户输入当作一个文本字符串而不是正则表达式对待。

9.7.3.5. 正则表达式匹配规则

在正则表达式可以匹配给出的字符串中多于一个子串的情况下,正则表达式 匹配字符串中最早开始匹配的那个子串。如果正则表达式可以匹配多个子串在那些位置开始处,要么是匹配最长的, 要么是最短的,具体哪种,取决于正则表达式是贪婪greedy的还是非贪婪non-greedy的。

一个正则表达式是否贪婪取决于下面规则:

  • 大多数原子,以及所有约束,都没有贪婪属性(因为它们毕竟无法匹配变量的文本)。

  • 在一个正则表达式周围加上圆括号并不会改变其贪婪性。

  • 一个带有固定重复次数的界定符(({m}{m}?)的量化原子和原子自身有着同样的贪婪性(可能是没有)。

  • 一个带其它普通的量词(包括{mn}m等于n的情况)量化的原子是贪婪的(首选最长匹配)。

  • 一个带非贪婪量词(包括{mn}?m等于n的情况)量化原子是非贪婪的(首选最短匹配)。

  • 一个分支(也就是一个没有顶级|操作符的 正则表达式)和它里面的第一个有贪婪属性的量化原子有着同样的贪婪性。

  • 一个由|操作符连接起来的两个或者更多分支组成的正则表达式总是贪婪的。

上面的规则所描述的贪婪属性不仅仅适用于独立的量化原子,而且也适用于 包含量化原子的分支和整个正则表达式。这里的意思是,匹配是按照分支或者整个 正则表达式作为一个整体匹配最长或者最短的子字符串的可能。一旦整个 匹配的长度确定,那么匹配任意子表达式的部分就基于该子表达式的贪婪属性进行判断, 在正则表达式里面靠前的子表达式的优先级高于靠后的子表达式。

一个表达这些意思的例子:

SELECT SUBSTRING('XY1234Z', 'Y*([0-9]{1,3})');
Result:123
SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})');
Result:1

在第一个例子里,正则表达式作为整体是贪婪的,因为Y*是贪婪的。 它可以匹配从Y开始的东西,并且它匹配从这个位置开始的最长的字符串, 也就是Y123。输出是这里的圆括弧包围的部分,或者说是123。在第二个例子里, 正则表达式总体上是一个非贪婪的正则表达式 ,因为Y*?是非贪婪的。它可以匹配 从Y开始的最短的子字符串,也就是说Y1。子表达式[0-9]{1,3}是贪婪的, 但是它不能修改总体匹配长度的决定;因此它被迫只匹配1

简单说,如果一个正则表达式同时包含贪婪和非贪婪的子表达式,那么总匹配长度要么是最长可能,要么是最短可能, 取决于给整个正则表达式赋予的贪婪属性。给子表达式赋予的贪婪属性只影响在这个匹配里, 各个子表达式之间相互允许"吃进"eat""的多少。

量词{1,1}{1,1}?可以分别用于在一个子表达式或者整个正则表达式上强制贪婪或者非贪婪。

匹配长度是以字符衡量的,而不是集合的元素。一个空字符串会被认为 比什么都不匹配长。比如:bb*匹配abbbc的中间三个字符; (week|wee)(night|knights)匹配weeknights的所有十个字符; 而(.*).*匹配abc的时候,圆括号包围的子表达式匹配所有三个字符; 而如果用(a*)*匹配bc,那么整个正则表达式和圆括号子表达式都匹配一个空字符串。

如果声明了大小写无关的匹配,那么效果就好像把所有字母上的大小写区别 取消了一样。如果一个存在大小写差别的字母以一个普通字符的形式出现在方括弧 表达式外面,那么它实际上被转换成一个包含大小写的方括弧表达式,也就是说, x变成[xX]。如果它出现在一个方括弧表达式里面,那么它的所有大小写的同族都被加入 方括弧表达式中,也就是说,[x]变成[xX][^x]变成[^xX]

如果声明了换行敏感匹配,.和使用^的方括弧表达式将永远不会匹配换行字 符(这样,匹配就绝对不会跨换行,除非正则表达式明确地指定了这样的情况)并 且^$除了分别匹配字符串开头和结尾之外,还将分别匹配换行后面和前面的 空字符串。但是 ARE 逃逸\A\Z仍然只配字符串的开头和结尾。

如果声明了部分换行敏感匹配,那么它影响.和 方括弧表达式,这个时候和换行敏感匹配一样,但是不影响^$.。

如果声明了反转换行敏感匹配,那么它影响^$,作用和换行敏感匹配里一样, 但是不影响.和方括号表达式。这个没什么太多用途,只是为了对称提供的。

9.7.3.6. 限制和兼容性

在这个实现里,对正则表达式的长度没有特别的限制,但是,那些希望能够有很好移植行的程序应该避免写超 过 256 字节的正则表达式 ,因为 POSIX 兼容的实现可以拒绝接受这样的正则表达式。

ARE 实际上和 POSIX ERE 不兼容的唯一的特性是在方括号表达式里\ 并不失去它特殊的含义。所有其它 ARE 特性都使用在 POSIX ERE 里面是非法或者是未定义、 未声明效果的语法;引导符的***就是再 POSIX 的 BRE 和 ERE 之外的语法。

许多 ARE 扩展都是从 Perl 那里拿来的,但是有些做了修改,去掉了, 以及一些 Perl 里没有出现的扩展。要注意的不兼容包括\b\B,对结尾的换行 缺乏特别的处理,对那些换行敏感匹配的附加的补齐方括弧表达式,在前瞻约束里 对圆括号和方括号引用的限制,以及最长/最短匹配(而不是第一匹配)语义。

PostgreSQL 7.4 之前的版本里的 ARE 和 ERE 存在两个非常显然的不兼容:

  • 在 ARE 里,后面跟着一个字母数字的\要么是一个逃逸,要么是错误,但是在以前的版本里, 它只是写那个字母数字的另外一种方法。这个应该不是什么问题,因为在以前的版本里没有什么原因让我们写这样的序列。

  • 在 ARE 里\[]里还是一个特殊字符, 因此在方括号表达式里的一个文本\必须写成\\

9.7.3.7. 基本正则表达式

BRE 在几个方面和 ERE 不太一样。|+?都是普通字符,它们没有等效的功能替换。 范围的分隔符是\{\},因为{}本身是普通字符。 嵌套的子表达式的圆括号是\(\),因为()自身是普通字符。 除非在正则表达式开头或者是圆括号封装的子表达式开头,^都是普通字符, 除非在正则表达式结尾或者是圆括号封装的子表达式的结尾,$是一个普通字符, 而如果*出现在正则表达式开头或者是圆括号封装的子表达式开头(前面可能有^), 那么它是个普通字符。最后,可以用单数字的后引用,以及\<\>分别 是[[:<:]][[:>:]]的同义词;没有其它的逃逸。

上一篇: 下一篇: