在 regexp_matches() 中使用起始锚点重复匹配

问题描述 投票:0回答:1

我需要从字符串中获取所有最大的数字序列,并要求整个字符串不应以“a”开头。 每个结果都应该是结果集中的一个单独条目。

澄清一下,如果模式中不存在捕获括号,则

regexp_matches()
返回一个结果集,其中包含仅具有一个元素的数组。 结果集由同一字符串中相同模式的连续匹配组成,从上一个匹配结束的地方开始下一个匹配。

如果不要求字符串不能以

a
开头,则满足该请求的示例如下:

select regexp_matches('bax 45456xx888z 89776uuu','\d+','gi');

以上将产生以下记录集:

"{45456}"
"{888}"
"{89776}"

有没有办法实现仅当整个字符串不以

a
开头时才匹配的要求?

regex postgresql
1个回答
0
投票

正如 @Wiktor Stribiżew 暗示,您可以使用 POSIX 正则表达式 负lookbehind 语法 来获取

\d+
的所有匹配项,除了那些前面有
a
的匹配项。 db<>fiddle 的演示:

with test(sample,comment)as(values
  ('bax 45456xx888z 89776uuu',  'no digits with an `a` up front'),
  ('bax a45456xxa888z 89776uuu','the first 2 digit sequences have a leading `a`'))
select * from test
cross join lateral regexp_matches(sample,'((?<!a\d*)\d+)','gi');
样品 评论 正则表达式_匹配
bax 45456xx888z 89776uuu 前面没有带“a”的数字 {45456}
bax 45456xx888z 89776uuu 前面没有带“a”的数字 {888}
bax 45456xx888z 89776uuu 前面没有带“a”的数字 {89776}
bax a45456xxa888z 89776uuu 前 2 位数字序列有一个前导 `a` {89776}
© www.soinside.com 2019 - 2024. All rights reserved.