regex - 如何在 Postgres 中为文本定义正则表达式
问题描述
请帮助为这种情况定义 Postgres 正则表达式:
我有字符串字段:
union all select 'AbC-345776-2345' /*comment*/ union all select 'Fgr-sdf344-111a' /*BN34*/ some text union all select 'sss-sdf34-123' /*some text*/ some text
为方便起见,这里是 select 语句中的相同文本:
select 'union all select ''AbC-345776-2345'' /*comment*/ union all select ''Fgr-sdf344-111a'' /*BN34*/ some text union all select ''sss-sdf34-123'' /*some text*/ some text' as str
我需要从这个混乱的文本中获取“...”中的唯一值,并将其选择到单独的行中,如下所示:
AbC-345776-2345
Fgr-sdf344-111a
sss-sdf34-123
模式:'前 2-3 个字母 - 几个字母和数字 - 几个字母和数字'
我创建了这个选择,但它也包含所有评论和“sometext”:
select regexp_split_to_table(trim(replace(replace(replace(replace(t1.str,'union all select',''),'from DUAL',''),chr(10),''),'''','') ), E'\\s+')
from (select 'union all select ''AbC-345776-2345'' /*comment*/ union all select ''Fgr-sdf344-111a'' /*BN34*/ some text union all select ''sss-sdf34-123'' /*some text*/ some text' as str) t1;
解决方案
以下应该做到这一点:
select (regexp_matches(str, $$'([a-zA-Z]{2,3}-[a-zA-Z0-9]+-[a-zA-Z0-9]+)'$$, 'g'))[1]
from the_table;
给定您返回的样本数据:
regexp_matches
---------------
AbC-345776-2345
Fgr-sdf344-111a
sss-sdf34-123
正则表达式检查您在单引号内指定的模式。通过使用一个组(...)
,我从结果中排除了单引号。
regexp_matches()
为每个匹配返回一行,包含匹配数组。但是由于正则表达式只包含一个组,所以数组的第一个元素是我们感兴趣的。
我使用美元引用来避免转义正则表达式中的单引号
推荐阅读
- html - 引导图标褪色
- r - 在R中按日期加入模糊匹配
- python - 使用 jupyter notebook 的终端时将 python2 更改为 python3
- r - R通过匹配改变多列
- swift - 如何仅对一个特定的修改器更改应用动画?
- javascript - 从 javascript(Google Apps 脚本)将数组添加到 html 文件
- linux - Phpmyadmin 4.9.5 -> $cfg['TempDir'] (/var/lib/phpmyadmin/tmp/) 不可访问,即使它存在并且具有正确的权限
- laravel - 整数的 Laravel 迁移默认值不起作用
- flutter - 如何获取页面未处理
- apache - 编写 .htaccess 以使文件夹中的所有文件 n 文件夹在维护模式(403(禁止模式))下在我的网站上提供服务?