我需要从字符串中获取所有最大的数字序列,并要求整个字符串不应以“a”开头。每个结果都应该是结果集中的一个单独条目。
澄清一下,regexp_matches()
如果模式中不存在捕获括号,则返回一个包含仅具有一个元素的数组的结果集。结果集由同一字符串中相同模式的连续匹配组成,从上一个匹配结束的位置开始下一个匹配。
如果不要求字符串不能以 开头a
,则满足该请求的示例如下:
select regexp_matches('bax 45456xx888z 89776uuu','\d+','gi');
以上将产生以下记录集:
"{45456}"
"{888}"
"{89776}"
有没有办法实现仅当整个字符串不以 开头时才匹配的要求a
?
正如@Wiktor Stribiżew所暗示的,您可以使用POSIX 正则表达式负向后查找语法来获取 的所有匹配项,除了那些前面有的匹配项。db<>fiddle 上的演示:
\d+
a
如果您只想避免
a
在整个事情的最开始使用带有 的字符串,则允许在各个数字字符串前面使用:我发现的唯一解决方案如下:
问题在于,没有对“*”的完整搜索,而只有贪婪或懒惰的版本。如果存在使用例如“¿”的“完整”匹配版本,则解决方案将是:
据我所知,Postgres PL/Perl 使用户能够用 Perl 编程语言编写 PostgreSQL 函数和过程。如果这样做了,就可以匹配正则表达式
如果有两个或多个匹配项,则除第一个之外的所有匹配项都将是感兴趣的数字字符串。
'a'
在这种情况下,第一个匹配将是紧随字符串开头的零宽度位置,这是可以忽略的。如果只有一个匹配,则它将是刚才提到的零宽度匹配,在这种情况下,字符串将不包含数字。
如果没有匹配,则字符串不会以以下形式开头
'a'
(并且可能包含也可能不包含数字字符串)。演示
该表达式可以分解如下。