Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex postgres正则表达式查询以匹配多个字符串模式_Regex_Postgresql - Fatal编程技术网

Regex postgres正则表达式查询以匹配多个字符串模式

Regex postgres正则表达式查询以匹配多个字符串模式,regex,postgresql,Regex,Postgresql,postgres查询选择具有包含数组中任何字符串的名称列的元素: select "elements".* from "elements" where "elements"."name" ~* 'hap|bir' 这很有效 现在,, 只有当列不按特定顺序包含数组的每个字符串时,才选择元素的正则表达式模式是什么?您的查询使用数组生成与以下非正则表达式相同的结果 SELECT * FROM elements WHERE lower(name) LIKE ANY(ARRAY['%hap%',

postgres查询选择具有包含数组中任何字符串的名称列的元素:

select "elements".* from "elements" where "elements"."name" ~* 'hap|bir'
这很有效

现在,,
只有当列不按特定顺序包含数组的每个字符串时,才选择元素的正则表达式模式是什么?

您的查询使用数组生成与以下非正则表达式相同的结果

SELECT * 
  FROM elements 
WHERE lower(name) LIKE ANY(ARRAY['%hap%', '%bir%']);
因此,要仅在列包含数组的每个字符串时从元素中选择,请将其从任意更改为全部


您的查询使用数组生成与以下类似非正则表达式的表达式相同的结果

SELECT * 
  FROM elements 
WHERE lower(name) LIKE ANY(ARRAY['%hap%', '%bir%']);
因此,要仅在列包含数组的每个字符串时从元素中选择,请将其从任意更改为全部


以下是一个正则表达式模式,仅当列不按特定顺序包含数组的每个字符串时才选择元素:

select "elements".* from "elements" where "elements"."name" ~* '(?=.*?(hap))(?=.*?(bir))'

from.

这里有一个正则表达式模式,仅当列不按特定顺序包含数组的每个字符串时才选择元素:

select "elements".* from "elements" where "elements"."name" ~* '(?=.*?(hap))(?=.*?(bir))'

从。

猜怎么着,您实际上可以将regexp match操作符与数组中的ALL组合起来

SELECT * 
  FROM elements 
WHERE name ~* ALL(ARRAY['\mhap\M', '\mbir\M'])
如果搜索文本不是单个字段,而是多个字段的串联,则这可能特别有利


注意:\m是单词的开头,\m是单词的结尾。

猜猜看,实际上可以将regexp match操作符与数组中的ALL组合起来

SELECT * 
  FROM elements 
WHERE name ~* ALL(ARRAY['\mhap\M', '\mbir\M'])
如果搜索文本不是单个字段,而是多个字段的串联,则这可能特别有利


注意:\m是单词的开头,\m是单词的结尾。

n不,实际上,向集合中的每个字符串传递两个regexp并不等于只传递一个。如果允许head wilcard表达式,则很难实现数据库中的Regexp匹配。您需要一个部分匹配搜索索引,并且必须将其传递给数组中的所有Regexp,使搜索按顺序进行,并使用n次,当您有一个不同的regexp数组时,单个regexp只需通过搜索字符串一次就可以决定,因此,比有n个regexp进行匹配更有效。@LuisColorado:请原谅我的无知。我不明白你在说什么。如果你有答案,请随意回答。谢谢!很抱歉,您说过您的查询实际上等价于使用数组的以下非正则表达式,但事实并非如此。这两个查询都需要通过regexp匹配器传递试图匹配字符串和候选字符串的数据,但是您将regexp输入到一个n-regex数组中,并且问题只使用一个。两个查询之间存在n对1的传递差异。要完全相等,需要构造一个与数组中的正则表达式相匹配的正则表达式,这就是|运算符在普通正则表达式中所做的。我不写答案。。。。。。因为这不是原始问题的答案。我应该对原来的问题有一个答案吗?我已经写了一个。@LuisColorado:啊!好啊当我的意思是等效时,我说它给出了相同的结果。我不担心它的实现部分。我不知道Postgres是如何实现第一个查询的,所以如果它是在n pass或1 pass中实现的,我就不能对它说什么。不,它实际上并不等同于向集合中的每个字符串传递两个regexp而不是只传递一个。如果允许head wilcard表达式,则很难实现数据库中的Regexp匹配。您需要一个部分匹配搜索索引,并且必须将其传递给数组中的所有Regexp,使搜索按顺序进行,并使用n次,当您有一个不同的regexp数组时,单个regexp只需通过搜索字符串一次就可以决定,因此,比有n个regexp进行匹配更有效。@LuisColorado:请原谅我的无知。我不明白你在说什么。如果你有答案,请随意回答。谢谢!很抱歉,您说过您的查询实际上等价于使用数组的以下非正则表达式,但事实并非如此。这两个查询都需要通过regexp匹配器传递试图匹配字符串和候选字符串的数据,但是您将regexp输入到一个n-regex数组中,并且问题只使用一个。两个查询之间存在n对1的传递差异。要完全相等,需要构造一个与数组中的正则表达式相匹配的正则表达式,这就是|运算符在普通正则表达式中所做的。我不写答案。。。。。。因为这不是原始问题的答案。我应该对原来的问题有一个答案吗?我已经写了一个。@LuisColorado:啊!好啊当我的意思是等效时,我说它给出了相同的结果。我不担心它的实现部分。我不知道Postgres是如何实现第一个查询的,所以如果它在n pass或1 pass中实现了,我就不能说什么了。