相关文章推荐
刚分手的红薯  ·  tkinter print ...·  1 年前    · 
string LIKE pattern [ESCAPE escape-character]string NOT LIKE pattern [ESCAPE escape-character] pattern  定义一个字符串的集合。如果该  string pattern  代表的字符串集合里,那么   表达式返回真。和我们想像的一样,如果   返回真,那么  NOT LIKE  表达式将返回假,反之亦然。一个等效的表达式是  NOT ( string pattern pattern  不包含百分号或者下划线,那么该模式只代表它本身;这时候   的行为就像等号操作符。在  pattern  里的下划线( )匹配任何单个字符;而一个百分号( )匹配零或多个任何字符。 一些例子: 'abc' LIKE 'abc'    true'abc' LIKE 'a%'     true'abc' LIKE '_b_'    true'abc' LIKE 'c'      false  模式匹配总是覆盖整个字符串。要匹配在字符串内部任何位置的序列,该模式必须以百分号开头和结尾。 要匹配下划线或者百分号本身,在  pattern  里相应的字符必须前导逃逸字符。缺省的逃逸字符是反斜杠,但是你可以用  ESCAPE  子句指定一个。要匹配逃逸字符本身,写两个逃逸字符。 请注意反斜杠在字符串文本里已经有特殊含义了,所以如果你写一个包含反斜杠的模式常量,那你就要在 SQL 语句里写两个反斜杠。因此,写一个匹配单个反斜杠的模式实际上要在语句里写四个反斜杠。你可以通过用  ESCAPE  选择一个不同的逃逸字符来避免这样;这样反斜杠就不再是   的特殊字符了。但仍然是字符文本分析器的特殊字符,所以你还是需要两个反斜杠。 我们也可以通过写成  ESCAPE ''  的方式关闭逃逸机制,这时,我们就不能关闭下划线和百分号的特殊含义。 ILIKE  可以用于替换   ,令该匹配就当前的区域设置是大小写无关的。这个特性不是 SQL 标准,是 PostgreSQL 扩展。 ILIKE  操作符分别代表  NOT LIKE NOT ILIKE  。所有这些操作符都是 PostgreSQL 特有的。 'abc' SIMILAR TO 'abc'      true'abc' SIMILAR TO 'a'        false'abc' SIMILAR TO '%(b|d)%'  true'abc' SIMILAR TO '(b|c)%'   false 带三个参数的  substring( string pattern escape-character  函数提供了一个从字符串中抽取一个匹配 SQL 正则表达式模式的子字符串功能。和  SIMILAR TO  一样,声明的模式必须匹配整个字符串,否则函数失效并返回 NULL 。为了标识在成功的时候应该返回的模式部分,模式必须出现后跟双引号( )的两个逃逸字符。匹配这两个标记之间的模式的字符串将被返回。 一些例子: substring('foobar' from '%#"o_b#"%' for '#')   oobsubstring('foobar' from '#"o_b#"%' for '#')    NULL  函数提供了从字符串中抽取一个匹配 POSIX 正则表达式模式的子字符串的方法。如果没有匹配它返回 NULL ,否则就是文本中匹配模式的那部分。但是如果该模式包含任何圆括弧,那么将返回匹配第一对子表达式(对应第一个左圆括弧的)的文本。如果你想在表达式里使用圆括弧而又不想导致这个例外,那么你可以在整个表达式外边放上一对圆括弧。如果你需要在想抽取的子表达式前有圆括弧,参阅描述的非捕获性圆括弧。 一些例子: substring('foobar' from 'o.b')     oobsubstring('foobar' from 'o(.)b')   o regexp_replace source pattern replacement flags ]) 函数提供了将匹配 POSIX 正则表达式模式的子字符串替换为新文本的功能。如果没有匹配  pattern  的子字符串,那么返回不加修改的  source  字符串。如果有匹配,则返回的  source  字符串里面的对应子字符串将被  replacement  字符串替换掉。 replacement  字符串可以包含   ,表明源字符串中匹配第   个圆括弧子表达式的部分将插入在该位置,并且它可以包含   表示应该插入匹配整个模式的字符串。如果你需要放一个文本反斜杠在替换文本里,那么写   (和通常一样,记得在文本常量字符串里写双反斜杠)。可选的  flags  参数包含零个或多个改变函数行为的单字母标记。  表示进行大小写无关的匹配,  表示替换每一个匹配的子字符串而不仅仅是第一个。 一些例子: regexp_replace('foobarbaz', 'b..', 'X')                                   fooXbazregexp_replace('foobarbaz', 'b..', 'X', 'g')                                   fooXXregexp_replace('foobarbaz', 'b(..)', E'X\\1Y', 'g')                                   fooXarYXazY PostgreSQL 的正则表达式使用 Henry Spencer 写的一个包来实现。下面的大部分描述都是从他的手册页里逐字拷贝过来的。 里的那些)。PostgreSQL 两种形式都实现了,并且还做了一些 POSIX 里面没有的,但是因为在类似 Perl 或者 Tcl 这样的语言中得到广泛应用的一些扩展。使用了那些非 POSIX 扩展的正则表达式叫  高级正则表达式 或 ARE。ARE 几乎完全是 ERE 的超集,但是 BRE 有几个符号上的不兼容(以及更多的限制)。我们首先描述 ARE 和 ERE 形式,描述那些只适用于 ARE 的特性,然后描述与 BRE 的区别是什么。 在正则表达式可以匹配给出的字符串中多于一个子字符串的情况下,正则表达式匹配字符串中最靠前的那个子字符串。如果正则表达式可以匹配在那个位置开始的多个子字符串,要么是取最长的子字符串,要么是最短的,具体哪种,取决于正则表达式是 一个正则表达式是否贪婪取决于下面规则: 匹配最长或者最短的子字符串的可能。一旦整个匹配的长度确定,那么匹配任意子表达式的部分就基于该子表达式的贪婪属性进行判断,在正则表达式里面靠前的子表达式的优先级高于靠后的子表达式。 一个表达这些的例子: SELECT SUBSTRING('XY1234Z', 'Y*([0-9]{1,3})');Result: 123SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})');Result: 1 在第一个例子里,正则表达式作为整体是贪婪的,因为   是贪婪的。它可以匹配从   开始的东西,并且它匹配从这个位置开始的最长的字符串,也就是   。输出是这里的圆括弧包围的部分,或者说是   。在第二个例子里,正则表达式总体上是一个非贪婪的正则表达式 ,因为   是非贪婪的。它可以匹配从   开始的最短的子字符串,也就是说   。子表达式  [0-9]{1,3}  是贪婪的,但是它不能修改总体匹配长度的决定;因此它被迫只匹配  简单说,如果一个正则表达式同时包含贪婪和非贪婪的子表达式,那么总匹配长度要么是最长可能,要么是最短可能,取决于给整个正则表达式赋予的贪婪属性。给子表达式赋予的贪婪属性只影响在这个匹配里,各个子表达式之间相互允许"吃进"的多少。 {1,1} {1,1}?  可以分别用于在一个子表达式或者整个正则表达式上强制贪婪或者非贪婪。 匹配长度是以字符衡量的,而不是集合的元素。一个空字符串会被认为比什么都不匹配长。比如: abbbc  的中间三个字符; (week|wee)(night|knights) weeknights  的所有十个字符;而  (.*).*  的时候,圆括弧包围的子表达式匹配所有三个字符;而如果用  (a*)*  ,那么正则表达式和圆括弧子表达式都匹配整个字符串。 如果声明了大小写无关的匹配,那么效果就好像把所有字母上的大小写区别取消了一样。如果一个存在大小写差别的字母以一个普通字符的形式出现在方括弧表达式外面,那么它实际上被转换成一个包含大小写的方括弧表达式,也就是说,  。如果它出现在一个方括弧表达式里面,那么它的所有大小写的同族都被加入方括弧表达式中,也就是说, [^xX] 如果声明了新行敏感匹配,  的方括弧表达式将永远不会匹配新行字符(这样,匹配就绝对不会跨新行,除非正则表达式明确地安排了这样的情况)并且   除了分别匹配字符串开头和结尾之外,还将分别匹配新行后面和前面的空字符串。但是 ARE 逃逸  匹配字符串的开头和结尾。 如果声明了部分新行敏感匹配,那么它影响   和方括弧表达式,这个时候和新行敏感匹配一样,但是不影响  如果声明了反转新行敏感匹配,那么它影响   ,作用和新行敏感匹配里一样,但是不影响   和方括弧表达式。这个没什么太多用途,只是为了对称提供的。 在这个实现里,对正则表达式的长度没有特别的限制,但是,那些希望能够有很好移植行的程序应该避免写超过 256 字节的正则表达式 ,因为 POSIX 兼容的实现可以拒绝接受这样的正则表达式。 ARE 实际上和 POSIX ERE 不兼容的唯一的特性是在方括弧表达式里   并不失去它特殊的含义。所有其它 ARE 特性都使用在 POSIX ERE 里面是非法或者是未定义、未声明效果的语法;指示器的   就是再 POSIX 的 BRE 和 ERE 之外的语法。 许多 ARE 扩展都是从 Perl 那里借来的,但是有些我做了修改,清理了一下,以及一些 Perl 里没有出现的扩展。要注意的不兼容包括   ,对结尾的新行缺乏特别的处理,对那些新行敏感匹配的附加的补齐方括弧表达式,在前瞻约束里对圆括弧和方括弧引用的限制,以及最长/最短匹配(而不是第一匹配)语义。 PostgreSQL 7.4 之前的版本里的 ARE 和 ERE 存在两个非常显著的不兼容:

广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员