而不是LIKE和〜,为什么只有SIMILAR TO才能与正则表达式匹配替代品

uni*_*ino 0 regex postgresql

通过下面的示例,我只使用表达式SIMILAR TO获得TRUE; LIKE和〜都显示为FALSE(我猜错了?)

由于SIMILAR TO在许多SO帖子中都不合适,我想了解是否有一种方法可以使用LIKE或〜来进行正则表达式与替代方案的匹配.

SELECT 'thomas' SIMILAR TO '%(h|x)%'
-- result: t

SELECT 'thomas' LIKE '%(h|x)%'
-- result: f

SELECT 'thomas' ~* '%(h|x)%'
-- result: f
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 5

LIKE支持使用_任何单个字符和%任何字符序列的模式匹配,因此:

SELECT 'thomas' LIKE '%(h|x)%'
Run Code Online (Sandbox Code Playgroud)

由于LIKE不了解(...)分组或|交替,因此这些只是LIKE模式中的文字字符.

SIMILAR TO支持_%LIKE一样,但添加分组(...),替换|和其他一些事情,所以这样:

SELECT 'thomas' SIMILAR TO '%(h|x)%'
Run Code Online (Sandbox Code Playgroud)

按预期工作.

~*使用POSIX正则表达式,因此(...)用于分组并且|用于交替,但%只是一个百分号; 这意味着:

SELECT 'thomas' ~* '%(h|x)%'
Run Code Online (Sandbox Code Playgroud)

正在寻找一个h或被x百分号所包围的东西,并且不会按照你期望的方式工作.

~*如果您使用正确的正则表达式,您的版本将起作用:

SELECT 'thomas' ~* '(h|x)' -- alternation
SELECT 'thomas' ~* 'h|x'   -- alternation without an unnecessary grouping
SELECT 'thomas' ~* '[hx]'  -- or a character class
Run Code Online (Sandbox Code Playgroud)

与上述相关的文档涵盖了所有这些内容.