天天看点

matlab table中的文字转string_Postgresql 中的 正则表达式 模式匹配

参考链接:

PostgreSQL 模式匹配​www.yiibai.com

1. like

string LIKE pattern [ESCAPE escape-character]
string NOT LIKE pattern [ESCAPE escape-character]
           

比较特别的地方:

在pattern里的下划线 (_)代表(匹配)任何单个字符; 而一个百分号(%)匹配任何零或更多个字符的序列。

LIKE模式匹配总是覆盖整个串。因此,要匹配在串内任何位置的序列,该模式必须以百分号

开头和结尾。

要匹配文本的下划线或者百分号,而不是匹配其它字符, 在pattern里相应的字符必须 前导逃

逸字符。缺省的逃逸字符是反斜线,但是你可以用ESCAPE子句指定一个不同的逃逸字符。

要匹配逃逸字符本身,写两个逃逸字符。

请注意反斜线在串文本里已经有特殊含义了,所以如果你写一个 包含反斜线的模式常量,那

你就要在 SQL 语句里写两个反斜线。 因此,写一个匹配单个反斜线的模式实际上要在语句

里写四个反斜线。 你可以通过用 ESCAPE 选择一个不同的逃逸字符 来避免这样;这样反斜

线就不再是 LIKE 的特殊字符了。 但仍然是字符文本分析器的特殊字符,所以你还是需要两

个反斜线。) 我们也可以通过写ESCAPE ''的方式不选择逃逸字符,这样可以有效地禁用逃逸

机制,但是没有办法关闭下划线和百分号在模式中的特殊含义。

关键字ILIKE可以用于替换LIKE, 它令该匹配根据活动区域成为大小写无关。这个不属于

SQL标准而是一个PostgreSQL扩展

操作符~~等效于LIKE, 而~~*对应ILIKE。 还有 !~~和!~~*操作符分别代表NOT LIKE和NOT

ILIKE。所有这些操作符都是PostgreSQL特有的。

2. SIMILAR TO正则表达式

string SIMILAR TO pattern [ESCAPE escape-character]
string NOT SIMILAR TO pattern [ESCAPE escape-character]
           

它和LIKE非常类似,只不过它使用 SQL 标准定义的正则表达式理解模式。 SQL 正则表达式是在LIKE标记和普通的正则表达式标记的奇怪的杂交。

类似LIKE,SIMILAR TO操作符只有在它的模式匹配整个串的时候才能成功;这一点和普通

的 正则表达式的行为不同,在普通的正则表达式里,模式匹配串的任意部分

SIMILAR TO使用_和%作为分别代表任意单个字符和任意串的通配符(这些可以比得上 POSIX 正则表达式里的.和.*)

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

式匹配元字符:

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

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

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

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

• {m}表示重复前面的项刚好m次。

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

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

• 可以使用圆括号()把多个项组合成一个逻辑项。

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

注意点号(.)不是SIMILAR TO的一个元字符。

和LIKE一样,反斜线禁用所有这些元字符的特殊含义;当然我们也可以用ESCAPE指定一个

不同的逃逸字符。

带三个参数的substring,即substring(string from pattern for escape-character),提供了抽取一个匹配 SQL 正则表达式的子串的方法。

和SIMILAR TO一样,声明的模式必须匹配整个数据函数和操作符串,否则函数失败并返回空值。

为了标识在成功的时候应该返回的模式部分,模式 必须

包含逃逸字符的两次出现,并且后面要跟上双引号(")

匹配这两个标记之间的模式的文本将被返回。

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

3.POSIX正则表达式

正则表达式匹配操作符

matlab table中的文字转string_Postgresql 中的 正则表达式 模式匹配
和LIKE模式不一样的是,正则表达式允许匹配串里的任何位置

,除非该正则表达式显式地挂接在串的开头或者结尾;

带两个参数的substring函数,即substring(string from pattern),提供了抽取一个匹配POSIX 正则表达式模式的子串的方法。如果没有匹配它返回空值,否则就是文本中匹配模式的那部分。

但是如果该模式包含任何圆括号,那么将返回匹配第一对子表达式(对应第一个左圆括号的) 的文本。

如果你想在表达式里使用圆括号而又不想导致这个例外,那么你可以在整个表达式外边放上一对圆括号。 如果你需要在想抽取的子表达式前有圆括号,参阅后文描述的非捕获性圆括号。

一些例子:
substring('foobar' from 'o.b') oob
substring('foobar' from 'o(.)b') o
           
regexp_replace函数

提供了将匹配 POSIX 正则表达式模式的子串替换为新文本的功能。

语法格式:

regexp_replace(source, pattern, replacement [, flags ])

如果没有匹配pattern,那么返回不加修改的source串;

replacement串可以包含n, 其中n是 1 到 9, 表明源串里匹配模式里第n个圆括号子表

达式的子串应该被插入;

并且它可以包含&表示应该插入匹配整个模式的子串;

如果你需要

放一个文字形式的反斜线在替换文本里,那么写;

regexp_match 函数返回从POSIX正则表达式模式

首次

匹配到字符串后捕获的子字符串的文本

数组;

语法是regexp_match(string, pattern [, flags ])

如果没有匹配,结果是NULL。如果找到匹配, 并且pattern不包含括起来的子表达式, 那么结果是包含匹配整个模式的子串的单元素文本数组;

如果找到匹配,并且pattern包含带括号的子表达式, 那么结果是一个文本数组,其中的第n个元素是匹配 pattern的括号括起来的第n 个子表达式的子字符串(不包括“非捕获”括号;详见下文);

flags参数是一个可选的文本字符串, 包含零个或多个单字母标志,用于更改函数的行为;

regexp_matches函数

返回一组捕获的字符串的文本数组, 该字符串是通过将POSIX正则表达

式模式匹配到字符串而得到的;

语法是regexp_matches(string, pattern [, flags ])

果没有匹配, 则此函数不返回任何行,如果有一个匹配且没有给出g标志,则返回一行;

如果有N个匹配,并给出g标志,则返回N行。

每个返回的行都是一个文本数组,它包含整个匹配的子字符串或匹配 pattern的括号子表达式的子字符串,就像上面针对 regexp_match所描述的一样。

regexp_split_to_table

把一个 POSIX 正则表达式模式当作一个定界符来分离一个串。

regexp_split_to_table

(string, pattern [, flags ])

regexp_split_to_array函数的行为和regexp_split_to_table相同,不过regexp_split_to_array会把它的结果以一个text数组的形式返回。它的语法是regexp_split_to_array(string, pattern [, flags ])。这些参数和regexp_split_to_table的相同。

ELECT foo FROM 
regexp_split_to_table('the quick brown fox jumps over the lazy dog', E's+')
AS foo;
foo
-------
the
quick
brown
fox
jumps
over
the
lazy
dog
(9 rows)
           
SELECT regexp_split_to_array('the quick brown fox jumps over the lazy dog', E's+');
regexp_split_to_array
-----------------------------------------------
{the,quick,brown,fox,jumps,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
           

[sS]*?表示匹配任意字符,且只匹配一次,即懒惰匹配;

如果是[sS]*没有带?号,也表示匹配任意字符,但允许匹配任意次,即贪婪匹配。

4. 正则表达式细节

matlab table中的文字转string_Postgresql 中的 正则表达式 模式匹配

注意:一个量词不能紧跟在另外一个量词后面,例如**是非法的。量词不能作为表达式或者子表达式的开头,也不能跟在^或者|后面。

matlab table中的文字转string_Postgresql 中的 正则表达式 模式匹配

5.方括号表达式

方括号表达式是一个包围在[]中的字符列表;

如果列表以^开头,它匹配任意单个不在该列表参与部分中的字符;

想在列表中包含文本],可以让它做列表的首字符(如果使用了^,需要放在其后);

想在列表中包含文本-,可以让它做列表的首字符或者尾字符,或者一个范围的第二个端点;

想在列表中把文本-当做范围的起点, 把它用[.和.]包围起来,这样它就成为一个排序元素(见下文;

6.正则表达式逃逸

继续阅读