72

PostgreSQL 支持\b吗?

我正在尝试\bAB\b,但它不匹配任何东西,而(\W|^)AB(\W|$)确实如此。这两个表达式本质上是一样的,不是吗?

4

3 回答 3

96

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 

请参阅手册中的正则表达式约束转义

还有[[:<:]]and [[:>:]],它匹配单词的开头和结尾。从手册

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

于 2010-09-29T20:46:00.623 回答
17

一个简单的例子

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. 注意双斜线
您可以手动设置:

set standard_conforming_strings=on;

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

于 2015-01-03T08:55:18.060 回答
5

文本中的精确单词搜索:

我面临以下问题。

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

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

我还尝试使用通配符周围的空白作为“% cto %”,它与包含“cto”的文本匹配,得到类似“vp、cto 和 manger”的结果,但没有准确标题为“cto”的结果。

我想要结果中的“副总裁、首席技术官和经理”和“首席技术官”,而不是结果中的“导演”

以下为我工作

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

~   Matches regular expression, case sensitive
~*  Matches regular expression, case insensitive    
于 2015-04-22T13:15:48.713 回答