gpt4 book ai didi

regex - Postgresql regexp_matches 语法未按预期工作

转载 作者:行者123 更新时间:2023-11-29 14:33:40 32 4
gpt4 key购买 nike

我使用 Postgres regexp_matches 函数来提取数字。

我使用的正则表达式是

4([\s\-\/\.]*?0){3}([\s\-\/\.]*?[12]){1}([\s\-\/\.]*?\d){4}

如果我使用类似 https://regexr.com/ 的工具验证它是否正常工作,我应用以下测试集

4-0001-1234
5-2342-2344
499999999
4-0001-1234 4.0001.12344 4-0-0-0-1-1234

我得到了预期的提取结果:

4-0001-1234
4-0001-1234
4.0001.1234
4-0-0-0-1-1234

但是,如果我在 Postgresql 中使用相同的表达式,它确实可以正常工作:

SELECT unnest(regexp_matches('4-0001-1234', '4([\s\-\/\.]*?0){3}([\s\-\/\.]*?[12]){1}([\s\-\/\.]*?\d){4}', 'g'));

结果:

0
1
4

我怀疑这与贪婪和/或像 {3} 这样的量词没有以正确的方式应用有关。或者它使用正则表达式的 Posix 标准,这似乎总是与 Java 语法有点不同。

有什么建议为什么它不起作用以及如何解决它?

最佳答案

regexp_matches(string text, pattern text [, flags text])函数返回捕获的值:

Return all captured substrings resulting from matching a POSIX regular expression against the string.

您可以使用非捕获组修复表达式:

SELECT unnest(regexp_matches('4-0001-1234 4.0001.12344  4-0-0-0-1-1234', '4(?:[\s/.-]*0){3}(?:[\s/.-]*[12])(?:[\s/.-]*\d){4}', 'g'));

参见 online demo .

enter image description here

顺便说一句,当 - 位于括号表达式的开头/结尾时,您不需要转义,也不需要转义 /. 那里。我还建议在任何支持限制量词的正则表达式中将 {1} 删除为 a = a{1}

关于regex - Postgresql regexp_matches 语法未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48110182/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com