首页 > 解决方案 > 如何使 javascript 正则表达式在 postgresql regexp_matches 中工作?

问题描述

我希望在文档中捕获小于 30% 且最多 4 个小数位的所有百分比。

这是一个有效的 javascript 正则表达式示例:https ://regex101.com/r/iM3nX5/5

当我\b(?:[1-2]?[0-9]\.[0-9]{1,4})\b[^a-zA-Z\d<]{0,3}%?在 Postgres 中使用这个正则表达式时,它不起作用:

SELECT regexp_matches('11111
11111.
11111.1111
.11111
a111.1111
99
010
101
100
100.01
2.95%
19.5113%
5.32
0.0250
9.32
24.32
0.0023
30.20
29.23', '\b(?:[1-2]?[0-9]\.[0-9]{1,4})\b[^a-zA-Z\d<]{0,3}%?', 'g')

关于我缺少什么使其在 Postgres 中工作的任何想法?

提前致谢。

标签: regexpostgresql

解决方案


单词边界是罪魁祸首。您需要使用\m/\M来匹配前导/尾随单词边界,或者\y相当于\b. 见表9.20。正则表达式约束转义

\m   仅在词
\M   首匹配 仅在词尾
\y   匹配 仅在词首或词尾匹配

例如,您可以使用

'\m(?:[1-2]?[0-9]\.[0-9]{1,4})\M[^a-zA-Z\d<]{0,3}%?'

或者

'\y(?:[1-2]?[0-9]\.[0-9]{1,4})\y[^a-zA-Z\d<]{0,3}%?'

在线查看PostgreSQL 演示。结果:

在此处输入图像描述


推荐阅读