Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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 正则表达式在正则表达式引擎中工作,但不在postgresql中工作_Regex_Postgresql - Fatal编程技术网

Regex 正则表达式在正则表达式引擎中工作,但不在postgresql中工作

Regex 正则表达式在正则表达式引擎中工作,但不在postgresql中工作,regex,postgresql,Regex,Postgresql,我尝试在管道分隔字符串中匹配编号13,如下所示: 13 - match 1|2|13 - match 13|1|2 - match 1|13|2 - match 1345|1|2 - should fail 1|1345|2 - should fail 1|2|1345 - should fail 1|4513|2 - should fail 4513|1|2 - should fail 2|3|4|4513- should fail 因此,如果13只出现在开头或结尾,或者在字符串之间作为一

我尝试在管道分隔字符串中匹配编号
13
,如下所示:

13 - match
1|2|13 - match
13|1|2 - match
1|13|2 - match

1345|1|2 - should fail
1|1345|2 - should fail
1|2|1345 - should fail
1|4513|2 - should fail
4513|1|2 - should fail
2|3|4|4513- should fail
因此,如果
13
只出现在开头或结尾,或者在字符串之间作为一个整体出现,那么它应该匹配

为此,我编写了以下正则表达式:

^13$|(\|13\|)?(?(1)|(^13\||\|13$))
在这方面,它正在按预期工作。请点击链接查看我的样本


但在Postgresql中,它会为以下查询抛出错误:

SELECT * FROM tbl_privilage WHERE user_id = 24 and show_id ~ '^13$|(\|13\|)?(?(1)|(^13\||\|13$))';
错误: 错误:无效的正则表达式:量词操作数无效


SQL状态:2201B

您需要在单词边界内匹配
13

你需要

[[:<:]]13[[:>:]]
[[::]]
即使数值周围有空格,此解决方案也应该有效

见:

括号表达式有两种特殊情况:括号 表达式
[[::]
是约束,匹配为空 分别位于单词开头和结尾的字符串


您需要在单词边界内匹配
13

你需要

[[:<:]]13[[:>:]]
[[::]]
即使数值周围有空格,此解决方案也应该有效

见:

括号表达式有两种特殊情况:括号 表达式
[[::]
是约束,匹配为空 分别位于单词开头和结尾的字符串

很明显,操作符
~
实现了POSIX正则表达式。在Regex101中,您使用的是PCRE(Perl兼容)正则表达式。这两个人非常友好

如果您需要PostgreSQL中的PCRE正则表达式,可以设置扩展。Like.

很清楚,操作符
~
实现POSIX正则表达式。在Regex101中,您使用的是PCRE(Perl兼容)正则表达式。这两个人非常友好


如果您需要PostgreSQL中的PCRE正则表达式,可以设置扩展。例如。

不要使用正则表达式,使用数组更健壮(也可能更高效):

这假定值和分隔符之间没有空格。您甚至可以索引该表达式,这可能会加快搜索速度


但我同意Frank的观点:你应该真正修复你的数据模型。

不要使用正则表达式,使用数组更健壮(也可能更高效):

这假定值和分隔符之间没有空格。您甚至可以索引该表达式,这可能会加快搜索速度


但我同意Frank的观点:你应该真正修复你的数据模型。

“管道分隔字符串”,你为什么这样存储数据?这造成了大量的问题,您的正则表达式只是众多问题中的一个。尝试修复真正的问题,即您的数据模型,而不是针对错误修复进行错误修复。@FrankHeikens我已经问过我们为什么不遵循规范化,但他们强迫我通过正则表达式进行检查。我们不应该像这样更改架构设计。人们回答我,我也没有权利:(如果你不/不能正常化,至少使用一个数组。这仍然是一个解决办法,但比一个问题要好得多。@FrankHeikens谢谢你的建议,因为我没有DB访问生产环境的权限。我已经建议高级官员使用任何收集对象,如你所说的数组,但他们说我们已经开发了很多php代码dep结束于此管道分隔值,因此无法更改。您只需尝试使用模式匹配来完成此任务,因此我尝试使用正则表达式。但我喜欢使用带有“无”名称答案的“马”。再次感谢您的反馈。“管道分隔字符串”,为什么要这样存储数据?这会产生大量问题,你的正则表达式只是众多问题中的一个。试着解决真正的问题,你的数据模型,而不是一个bug修复一个bug修复。@FrankHeikens我已经问过为什么我们不遵循规范化,但他们强迫我通过正则表达式检查它我们不应该更改模式设计n就像人们回答我的那样,我也没有权利:(如果你不/不能正常化,至少使用一个数组。这仍然是一个解决办法,但比一个问题要好得多。@FrankHeikens谢谢你的建议,因为我没有DB访问生产环境的权限。我已经建议高级官员使用任何收集对象,如你所说的数组,但他们说我们已经开发了很多php代码dep结束于此管道分隔值,因此无法更改。您只需尝试使用模式匹配来完成此任务,因此我尝试使用正则表达式。但我喜欢使用带有“无”名称答案的“马”。再次感谢您的反馈。@Stibizev所有正则表达式模式工作正常,如我所料,我通过如下分隔正则表达式来检查它
^13$
(\\\\\\\\\\\\\\\)?
(^13\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/code>)
(^code>)
(^code>)没有按照我的预期工作。您在该站点上选择了PCRE/PHP选项吗?如果选择了,
(?(1)
是一个条件表达式。
如果第(1)款(^12413$)
。您无法将regex101中的regexp直接粘贴到PostGre查询中,您需要确保它们与这种特殊的regex风格兼容。您需要的是单词边界检查。在大多数regex引擎中,它是
\b
。但在PostgreSQL中则不是。即使字符串中有多余空格,regex解决方案也可以工作(例如
1 | 13 | 2
)是的,但实际上这个字符串是用php内爆准备的,对于使用yii findall AR方法获取的传递主键,所以在我们的项目中,这个问题不会发生,但总体上肯定会发生。我使用了一个带有“no”name的“horse”的答案,我也对你的答案进行了投票,因为pin指向空格可能会破坏正则表达式。我对postgres来说是个新手,主要是我我使用的是mysql。两者都只遵循sql标准,但无法实现我预期的解决方案。我对postgres函数完全不了解。@stibizhev all regex模式工作正常