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模式工作正常