PostgreSQL Regex Word Boundaries?

Does PostgreSQL support \b?

I'm trying \bAB\b but it doesn't match anything, whereas (\W|^)AB(\W|$) does. These 2 expressions are essentially the same, aren't they?

18587 次浏览

PostgreSQL 使用 \m\M\y\Y作为单词边界:

\m   matches only at the beginning of a word
\M   matches only at the end of a word
\y   matches only at the beginning or end of a word
\Y   matches only at a point that is not the beginning or end of a word

See 正则表达式约束转义 in the manual.

还有 [[:<:]][[:>:]],它们与一个单词的开头和结尾相匹配。来自 手册:

括号表达式有两种特殊情况: 括号表达式 [[:<:]][[:>:]]是约束,分别在单词的开头和结尾处匹配空字符串。一个单词被定义为既不在单词字符前面也不在单词字符后面的单词字符序列。单词字符是 alnum 字符(由 ctype 定义)或下划线。这是一个扩展,与 POSIX 1003.2兼容,但没有指定,并且应该谨慎使用打算移植到其他系统的软件。下面描述的约束转义通常是可取的(它们不再是标准的,但肯定更容易输入)。

举个简单的例子

select * from table_name where column ~* '\yAB\y';

这将匹配 AB ab ab - text text ab text AB text-ab-text text AB text...

但你必须使用:

select * from sometable where name ~* '\\yAB\\y';

如果你有 standard_conforming_strings标志 设置为 OFF。注意 double slashes。 < br/> 你可以手动设置它:

set standard_conforming_strings=on;

然后: select * from table_name where column ~* '\yAB\y';应该工作。

文本中的精确单词搜索:

我遇到了以下问题。

我想搜索所有在标题中有“ cto”作为确切单词的联系人,但结果是得到的结果是标题中有“ Director”,我使用了以下查询

select * from contacts where title ilike '%cto%';

我还尝试在通配符周围使用空格作为“% cto%”,它正在与包含“ cto”的文本进行匹配,得到的结果是“ vp,cto 和 manger”,但没有得到确切标题为“ cto”的结果。

我希望在结果中同时使用“ vp,cto 和 manger”和“ cto”,而不是在结果中使用“ Director”

Following worked for me

select * from contacts where title ~* '\\ycto\\y';


~   Matches regular expression, case sensitive
~*  Matches regular expression, case insensitive