Regex 如何使用正则表达式匹配修剪子字符串的结果?

Regex 如何使用正则表达式匹配修剪子字符串的结果?,regex,postgresql,Regex,Postgresql,我在postgresql中有这组数据: en_MY_V2_CID_MY_SEM_1_1_0_0 en_MY_V2_CID_MY_SEM_2_101_1703_0 en_MY_V2_CID_MY_SEM_2_101_1724_0 en_MY_CID_MY_DIS_1_100_1705_0068 en_MY_CID_MY_DIS_1_100_1705_0068 select substring(name from '_\d+_\d+_\d+$') from logs; 我想像这样提取子字符串:

我在postgresql中有这组数据:

en_MY_V2_CID_MY_SEM_1_1_0_0
en_MY_V2_CID_MY_SEM_2_101_1703_0
en_MY_V2_CID_MY_SEM_2_101_1724_0
en_MY_CID_MY_DIS_1_100_1705_0068
en_MY_CID_MY_DIS_1_100_1705_0068
select substring(name from '_\d+_\d+_\d+$') from logs;
我想像这样提取子字符串:

en_MY_V2_CID_MY_SEM_1
en_MY_V2_CID_MY_SEM_2
en_MY_V2_CID_MY_SEM_2
en_MY_CID_MY_DIS_1
en_MY_CID_MY_DIS_1
问题是,左侧结构不是常量,所以我无法使用正则表达式来理解它们。相反,右侧结构是常量,格式为
\u numbers\u numbers\u numbers
。因此,我尝试在postgresql中使用此查询:

en_MY_V2_CID_MY_SEM_1_1_0_0
en_MY_V2_CID_MY_SEM_2_101_1703_0
en_MY_V2_CID_MY_SEM_2_101_1724_0
en_MY_CID_MY_DIS_1_100_1705_0068
en_MY_CID_MY_DIS_1_100_1705_0068
select substring(name from '_\d+_\d+_\d+$') from logs;
并获得:

1_0_0
101_1703_0
101_1724_0
100_1705_0068
1705_0068
所以问题是,如何否定或修剪前面的子字符串以获得结果?

使用rexep\u替换

select regexp_replace(name,E'\(\\w\)_\\d+_\\d+_\\d+$',E'\\1') from logs;
使用rexep_替换

select regexp_replace(name,E'\(\\w\)_\\d+_\\d+_\\d+$',E'\\1') from logs;

或者更简单:
从日志中选择regexp_replace(名称,E''\\\d+\\\d+\\\d+$,'')或更简单:
从日志中选择regexp_replace(名称,E''\\\d+\\\d+\\\$',''