Postgres模式匹配字符串的中间字母

Postgres pattern matching middle letters of a string

我如何匹配一个名字,这样名字的中间字母之一必须来自单词 'qwerty'(因此包含字母 'q'、'w' , 'e', 'r', 't','y')?

我很好奇你如何确定中间字母是什么,这将使用我假设的一些字符串计数。

到目前为止我尝试过的:

WHERE name LIKE '%(q|w|e|r|t|y)%'

匹配的示例:

Martens
Van Rossem
Frimout
Gates

注意:在我的练习上下文中,中间字母表示第一个和最后一个字母之间的任何内容。我仍然很好奇如何匹配字符串的 'median' 字母。

您似乎想要在左右匹配相同数量的字符,然后在中间匹配一些字符,但这在 PostgreSQL 正则表达式中是不可能的。

要查找包含预定义集中任何字符的记录,您可以使用 SIMILAR TO%[qwerty]% 模式:

SIMILAR TO '%[qwerty]%'

%是匹配任意文本的正则通配符,[qwery]是匹配单个字符的括号表达式,qwerty.

如果你只是想确保这些字符不在开头和结尾,你可以尝试这样的表达式

SIMILAR TO '[^qwerty]+[qwerty]+[^qwerty]+'

请记住 PostgreSQL SIMILAR TO 模式需要完整的字符串匹配,您将只会获得以 q 以外的 1+ 个字符开头的记录,werty[^...]是一个取反的括号表达式) ,然后是 1 个或多个必需的字符,然后是 1 个以上的字符。

另一种可能更简单的解决方案是使用 PostgreSQL 的正则表达式匹配运算符 ~:

WHERE name ~ '.[qwerty].'

该模式表示:任意字符,后跟任意字符 qwerty,后跟另一个任意字符。

请注意,PostgreSQL 在内部将 SIMILAR TO 表达式转换为正则表达式。