我需要从字符串中获取所有最大的数字序列,并要求整个字符串不应以“a”开头。 每个结果都应该是结果集中的一个单独条目。
澄清一下,如果模式中不存在捕获括号,则
regexp_matches()
返回一个结果集,其中包含仅具有一个元素的数组。
结果集由同一字符串中相同模式的连续匹配组成,从上一个匹配结束的地方开始下一个匹配。
如果不要求字符串不能以
a
开头,则满足该请求的示例如下:
select regexp_matches('bax 45456xx888z 89776uuu','\d+','gi');
以上将产生以下记录集:
"{45456}"
"{888}"
"{89776}"
有没有办法实现仅当整个字符串不以
a
开头时才匹配的要求?
正如 @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} |