目录搜索
前言何为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和OFFSET7.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 BY11.5. 组合多个索引11.6. 唯一索引11.7. 表达式上的索引11.8. 部分索引11.9. 操作类和操作簇11.10. 检查索引的使用章12. Full Text Search12.1. Introduction12.2. Tables and Indexes12.3. Controlling Text Search12.4. Additional Features12.5. Parsers12.6. Dictionaries12.7. Configuration Example12.8. Testing and Debugging Text Search12.9. GiST and GIN Index Types12.10. psql Support12.11. Limitations12.12. Migration from Pre-8.3 Text Search章13. 并发控制13.1. 介绍13.2. 事务隔离13.3. 明确锁定13.4. 应用层数据完整性检查13.5. 锁和索引章14. 性能提升技巧14.1. 使用EXPLAIN14.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 Windows16.1. Building with Visual C++ or the Platform SDK16.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 Tests30.1. Running the Tests30.2. Test Evaluation30.3. Variant Comparison Files30.4. Test Coverage ExaminationIV. 客户端接口章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 C33.1. The Concept33.2. Connecting to the Database Server33.3. Closing a Connection33.4. Running SQL Commands33.5. Choosing a Connection33.6. Using Host Variables33.7. Dynamic SQL33.8. pgtypes library33.9. Using Descriptor Areas33.10. Informix compatibility mode33.11. Error Handling33.12. Preprocessor directives33.13. Processing Embedded SQL Programs33.14. Library Functions33.15. Internals章34. 信息模式34.1. 关于这个模式34.2. 数据类型34.3. information_schema_catalog_name34.4. administrable_role_authorizations34.5. applicable_roles34.6. attributes34.7. check_constraint_routine_usage34.8. check_constraints34.9. column_domain_usage34.10. column_privileges34.11. column_udt_usage34.12. 字段34.13. constraint_column_usage34.14. constraint_table_usage34.15. data_type_privileges34.16. domain_constraints34.18. domains34.17. domain_udt_usage34.19. element_types34.20. enabled_roles34.21. foreign_data_wrapper_options34.22. foreign_data_wrappers34.23. foreign_server_options34.24. foreign_servers34.25. key_column_usage34.26. parameters34.27. referential_constraints34.28. role_column_grants34.29. role_routine_grants34.30. role_table_grants34.31. role_usage_grants34.32. routine_privileges34.33. routines34.34. schemata34.35. sequences34.36. sql_features34.37. sql_implementation_info34.38. sql_languages34.39. sql_packages34.40. sql_parts34.41. sql_sizing34.42. sql_sizing_profiles34.43. table_constraints34.44. table_privileges34.45. tables34.46. triggered_update_columns34.47. 触发器34.48. usage_privileges34.49. user_mapping_options34.50. user_mappings34.51. view_column_usage34.52. view_routine_usage34.53. view_table_usage34.54. 视图V. 服务器端编程章35. 扩展SQL35.1. 扩展性是如何实现的35.2. PostgreSQL类型系统35.3. User-Defined Functions35.4. Query Language (SQL) Functions35.5. Function Overloading35.6. Function Volatility Categories35.7. Procedural Language Functions35.8. Internal Functions35.9. C-Language Functions35.10. User-Defined Aggregates35.11. User-Defined Types35.12. User-Defined Operators35.13. Operator Optimization Information35.14. Interfacing Extensions To Indexes35.15. 用C++扩展章36. 触发器36.1. 触发器行为概述36.3. 用 C 写触发器36.2. 数据改变的可视性36.4. 一个完整的例子章37. 规则系统37.1. The Query Tree37.2. 视图和规则系统37.3. 在INSERT,UPDATE和DELETE上的规则37.4. 规则和权限37.5. 规则和命令状态37.6. 规则与触发器得比较章38. Procedural Languages38.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 Hood39.11. 开发PL/pgSQL的一些提示39.12. 从OraclePL/SQL 进行移植章40. PL/Tcl - Tcl Procedural Language40.1. Overview40.2. PL/Tcl Functions and Arguments40.3. Data Values in PL/Tcl40.4. Global Data in PL/Tcl40.5. Database Access from PL/Tcl40.6. Trigger Procedures in PL/Tcl40.7. Modules and the unknown command40.8. Tcl Procedure Names章41. PL/Perl - Perl Procedural Language41.1. PL/Perl Functions and Arguments41.2. Data Values in PL/Perl41.3. Built-in Functions41.4. Global Values in PL/Perl41.6. PL/Perl Triggers41.5. Trusted and Untrusted PL/Perl41.7. PL/Perl Under the Hood章42. PL/Python - Python Procedural Language42.1. Python 2 vs. Python 342.2. PL/Python Functions42.3. Data Values42.4. Sharing Data42.5. Anonymous Code Blocks42.6. Trigger Functions42.7. Database Access42.8. Utility Functions42.9. Environment Variables章43. Server Programming Interface43.1. Interface FunctionsSpi-spi-connectSpi-spi-finishSpi-spi-pushSpi-spi-popSpi-spi-executeSpi-spi-execSpi-spi-execute-with-argsSpi-spi-prepareSpi-spi-prepare-cursorSpi-spi-prepare-paramsSpi-spi-getargcountSpi-spi-getargtypeidSpi-spi-is-cursor-planSpi-spi-execute-planSpi-spi-execute-plan-with-paramlistSpi-spi-execpSpi-spi-cursor-openSpi-spi-cursor-open-with-argsSpi-spi-cursor-open-with-paramlistSpi-spi-cursor-findSpi-spi-cursor-fetchSpi-spi-cursor-moveSpi-spi-scroll-cursor-fetchSpi-spi-scroll-cursor-moveSpi-spi-cursor-closeSpi-spi-saveplan43.2. Interface Support FunctionsSpi-spi-fnameSpi-spi-fnumberSpi-spi-getvalueSpi-spi-getbinvalSpi-spi-gettypeSpi-spi-gettypeidSpi-spi-getrelnameSpi-spi-getnspname43.3. Memory ManagementSpi-spi-pallocSpi-reallocSpi-spi-pfreeSpi-spi-copytupleSpi-spi-returntupleSpi-spi-modifytupleSpi-spi-freetupleSpi-spi-freetupletableSpi-spi-freeplan43.4. Visibility of Data Changes43.5. ExamplesVI. 参考手册I. SQL命令Sql-abortSql-alteraggregateSql-alterconversionSql-alterdatabaseSql-alterdefaultprivilegesSql-alterdomainSql-alterforeigndatawrapperSql-alterfunctionSql-altergroupSql-alterindexSql-alterlanguageSql-alterlargeobjectSql-alteroperatorSql-alteropclassSql-alteropfamilySql-alterroleSql-alterschemaSql-altersequenceSql-alterserverSql-altertableSql-altertablespaceSql-altertsconfigSql-altertsdictionarySql-altertsparserSql-altertstemplateSql-altertriggerSql-altertypeSql-alteruserSql-alterusermappingSql-alterviewSql-analyzeSql-beginSql-checkpointSql-closeSql-clusterSql-commentSql-commitSql-commit-preparedSql-copySql-createaggregateSql-createcastSql-createconstraintSql-createconversionSql-createdatabaseSql-createdomainSql-createforeigndatawrapperSql-createfunctionSql-creategroupSql-createindexSql-createlanguageSql-createoperatorSql-createopclassSql-createopfamilySql-createroleSql-createruleSql-createschemaSql-createsequenceSql-createserverSql-createtableSql-createtableasSql-createtablespaceSql-createtsconfigSql-createtsdictionarySql-createtsparserSql-createtstemplateSql-createtriggerSql-createtypeSql-createuserSql-createusermappingSql-createviewSql-deallocateSql-declareSql-deleteSql-discardSql-doSql-dropaggregateSql-dropcastSql-dropconversionSql-dropdatabaseSql-dropdomainSql-dropforeigndatawrapperSql-dropfunctionSql-dropgroupSql-dropindexSql-droplanguageSql-dropoperatorSql-dropopclassSql-dropopfamilySql-drop-ownedSql-droproleSql-dropruleSql-dropschemaSql-dropsequenceSql-dropserverSql-droptableSql-droptablespaceSql-droptsconfigSql-droptsdictionarySql-droptsparserSql-droptstemplateSql-droptriggerSql-droptypeSql-dropuserSql-dropusermappingSql-dropviewSql-endSql-executeSql-explainSql-fetchSql-grantSql-insertSql-listenSql-loadSql-lockSql-moveSql-notifySql-prepareSql-prepare-transactionSql-reassign-ownedSql-reindexSql-release-savepointSql-resetSql-revokeSql-rollbackSql-rollback-preparedSql-rollback-toSql-savepointSql-selectSql-selectintoSql-setSql-set-constraintsSql-set-roleSql-set-session-authorizationSql-set-transactionSql-showSql-start-transactionSql-truncateSql-unlistenSql-updateSql-vacuumSql-valuesII. 客户端应用程序App-clusterdbApp-createdbApp-createlangApp-createuserApp-dropdbApp-droplangApp-dropuserApp-ecpgApp-pgconfigApp-pgdumpApp-pg-dumpallApp-pgrestoreApp-psqlApp-reindexdbApp-vacuumdbIII. PostgreSQL服务器应用程序App-initdbApp-pgcontroldataApp-pg-ctlApp-pgresetxlogApp-postgresApp-postmasterVII. 内部章44. PostgreSQL内部概览44.1. 查询路径44.2. 连接是如何建立起来的44.3. 分析器阶段44.4. ThePostgreSQL规则系统44.5. 规划器/优化器44.6. 执行器章45. 系统表45.1. 概述45.2. pg_aggregate45.3. pg_am45.4. pg_amop45.5. pg_amproc45.6. pg_attrdef45.7. pg_attribute45.8. pg_authid45.9. pg_auth_members45.10. pg_cast45.11. pg_class45.12. pg_constraint45.13. pg_conversion45.14. pg_database45.15. pg_db_role_setting45.16. pg_default_acl45.17. pg_depend45.18. pg_description45.19. pg_enum45.20. pg_foreign_data_wrapper45.21. pg_foreign_server45.22. pg_index45.23. pg_inherits45.24. pg_language45.25. pg_largeobject45.26. pg_largeobject_metadata45.27. pg_namespace45.28. pg_opclass45.29. pg_operator45.30. pg_opfamily45.31. pg_pltemplate45.32. pg_proc45.33. pg_rewrite45.34. pg_shdepend45.35. pg_shdescription45.36. pg_statistic45.37. pg_tablespace45.38. pg_trigger45.39. pg_ts_config45.40. pg_ts_config_map45.41. pg_ts_dict45.42. pg_ts_parser45.43. pg_ts_template45.44. pg_type45.45. pg_user_mapping45.46. System Views45.47. pg_cursors45.48. pg_group45.49. pg_indexes45.50. pg_locks45.51. pg_prepared_statements45.52. pg_prepared_xacts45.53. pg_roles45.54. pg_rules45.55. pg_settings45.56. pg_shadow45.57. pg_stats45.58. pg_tables45.59. pg_timezone_abbrevs45.60. pg_timezone_names45.61. pg_user45.62. pg_user_mappings45.63. pg_views章46. Frontend/Backend Protocol46.1. Overview46.2. Message Flow46.3. Streaming Replication Protocol46.4. Message Data Types46.5. Message Formats46.6. Error and Notice Message Fields46.7. Summary of Changes since Protocol 2.047. PostgreSQL Coding Conventions47.1. Formatting47.2. Reporting Errors Within the Server47.3. Error Message Style Guide章48. Native Language Support48.1. For the Translator48.2. For the Programmer章49. Writing A Procedural Language Handler章50. Genetic Query Optimizer50.1. Query Handling as a Complex Optimization Problem50.2. Genetic Algorithms50.3. Genetic Query Optimization (GEQO) in PostgreSQL50.4. Further Reading章51. 索引访问方法接口定义51.1. 索引的系统表记录51.2. 索引访问方法函数51.3. 索引扫描51.4. 索引锁的考量51.5. 索引唯一性检查51.6. 索引开销估计函数章52. GiST Indexes52.1. Introduction52.2. Extensibility52.3. Implementation52.4. Examples52.5. Crash Recovery章53. GIN Indexes53.1. Introduction53.2. Extensibility53.3. Implementation53.4. GIN tips and tricks53.5. Limitations53.6. Examples章54. 数据库物理存储54.1. 数据库文件布局54.2. TOAST54.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 ConformanceD.1. Supported FeaturesD.2. Unsupported FeaturesE. Release NotesRelease-0-01Release-0-02Release-0-03Release-1-0Release-1-01Release-1-02Release-1-09Release-6-0Release-6-1Release-6-1-1Release-6-2Release-6-2-1Release-6-3Release-6-3-1Release-6-3-2Release-6-4Release-6-4-1Release-6-4-2Release-6-5Release-6-5-1Release-6-5-2Release-6-5-3Release-7-0Release-7-0-1Release-7-0-2Release-7-0-3Release-7-1Release-7-1-1Release-7-1-2Release-7-1-3Release-7-2Release-7-2-1Release-7-2-2Release-7-2-3Release-7-2-4Release-7-2-5Release-7-2-6Release-7-2-7Release-7-2-8Release-7-3Release-7-3-1Release-7-3-10Release-7-3-11Release-7-3-12Release-7-3-13Release-7-3-14Release-7-3-15Release-7-3-16Release-7-3-17Release-7-3-18Release-7-3-19Release-7-3-2Release-7-3-20Release-7-3-21Release-7-3-3Release-7-3-4Release-7-3-5Release-7-3-6Release-7-3-7Release-7-3-8Release-7-3-9Release-7-4Release-7-4-1Release-7-4-10Release-7-4-11Release-7-4-12Release-7-4-13Release-7-4-14Release-7-4-15Release-7-4-16Release-7-4-17Release-7-4-18Release-7-4-19Release-7-4-2Release-7-4-20Release-7-4-21Release-7-4-22Release-7-4-23Release-7-4-24Release-7-4-25Release-7-4-26Release-7-4-27Release-7-4-28Release-7-4-29Release-7-4-3Release-7-4-30Release-7-4-4Release-7-4-5Release-7-4-6Release-7-4-7Release-7-4-8Release-7-4-9Release-8-0Release-8-0-1Release-8-0-10Release-8-0-11Release-8-0-12Release-8-0-13Release-8-0-14Release-8-0-15Release-8-0-16Release-8-0-17Release-8-0-18Release-8-0-19Release-8-0-2Release-8-0-20Release-8-0-21Release-8-0-22Release-8-0-23Release-8-0-24Release-8-0-25Release-8-0-26Release-8-0-3Release-8-0-4Release-8-0-5Release-8-0-6Release-8-0-7Release-8-0-8Release-8-0-9Release-8-1Release-8-1-1Release-8-1-10Release-8-1-11Release-8-1-12Release-8-1-13Release-8-1-14Release-8-1-15Release-8-1-16Release-8-1-17Release-8-1-18Release-8-1-19Release-8-1-2Release-8-1-20Release-8-1-21Release-8-1-22Release-8-1-23Release-8-1-3Release-8-1-4Release-8-1-5Release-8-1-6Release-8-1-7Release-8-1-8Release-8-1-9Release-8-2Release-8-2-1Release-8-2-10Release-8-2-11Release-8-2-12Release-8-2-13Release-8-2-14Release-8-2-15Release-8-2-16Release-8-2-17Release-8-2-18Release-8-2-19Release-8-2-2Release-8-2-20Release-8-2-21Release-8-2-3Release-8-2-4Release-8-2-5Release-8-2-6Release-8-2-7Release-8-2-8Release-8-2-9Release-8-3Release-8-3-1Release-8-3-10Release-8-3-11Release-8-3-12Release-8-3-13Release-8-3-14Release-8-3-15Release-8-3-2Release-8-3-3Release-8-3-4Release-8-3-5Release-8-3-6Release-8-3-7Release-8-3-8Release-8-3-9Release-8-4Release-8-4-1Release-8-4-2Release-8-4-3Release-8-4-4Release-8-4-5Release-8-4-6Release-8-4-7Release-8-4-8Release-9-0Release-9-0-1Release-9-0-2Release-9-0-3Release-9-0-4F. 额外提供的模块F.1. adminpackF.2. auto_explainF.3. btree_ginF.4. btree_gistF.5. chkpassF.6. citextF.7. cubeF.8. dblinkContrib-dblink-connectContrib-dblink-connect-uContrib-dblink-disconnectContrib-dblinkContrib-dblink-execContrib-dblink-openContrib-dblink-fetchContrib-dblink-closeContrib-dblink-get-connectionsContrib-dblink-error-messageContrib-dblink-send-queryContrib-dblink-is-busyContrib-dblink-get-notifyContrib-dblink-get-resultContrib-dblink-cancel-queryContrib-dblink-get-pkeyContrib-dblink-build-sql-insertContrib-dblink-build-sql-deleteContrib-dblink-build-sql-updateF.9. dict_intF.10. dict_xsynF.11. earthdistanceF.12. fuzzystrmatchF.13. hstoreF.14. intaggF.15. intarrayF.16. isnF.17. loF.18. ltreeF.19. oid2nameF.20. pageinspectF.21. passwordcheckF.22. pg_archivecleanupF.23. pgbenchF.24. pg_buffercacheF.25. pgcryptoF.26. pg_freespacemapF.27. pgrowlocksF.28. pg_standbyF.29. pg_stat_statementsF.30. pgstattupleF.31. pg_trgmF.32. pg_upgradeF.33. segF.34. spiF.35. sslinfoF.36. tablefuncF.37. test_parserF.38. tsearch2F.39. unaccentF.40. uuid-osspF.41. vacuumloF.42. xml2G. 外部项目G.1. 客户端接口G.2. 过程语言G.3. 扩展H. The Source Code RepositoryH.1. Getting The Source Via GitI. 文档I.1. DocBookI.2. 工具集I.3. 制作文档I.4. 文档写作I.5. 风格指导J. 首字母缩略词参考书目BookindexIndex
文字

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

上一篇:下一篇: