正则表达式 - 在逗号之间的序列中捕获下划线之间的数字

Posted

技术标签:

【中文标题】正则表达式 - 在逗号之间的序列中捕获下划线之间的数字【英文标题】:Regular expression - capture number between underscores within a sequence between commas 【发布时间】:2020-01-15 12:57:10 【问题描述】:

我在数据库表中有一个字段,格式为:

111_2222_33333,222_444_3,aaa_bbb_ccc

这是整个字段统一的格式。三个下划线分隔的数值,一个逗号,另外三个下划线分隔的数值,另一个逗号,然后是三个下划线分隔的文本值。中间没有空格

我想从第二个数字序列中提取中间值,在上面的例子中我想得到 444

在我继承的 SQL 查询中,使用的正则表达式是 ^.,(\d+)_.$,但这似乎没有任何作用。

我尝试识别第一个逗号、后面的第一个数字和以下下划线 ,222_ 用作起点,然后从那里得到下一个数字,后面没有 _

这个(,\d*_)(\d+[^_]) 选择,222_444 是我得到的最接近的

【问题讨论】:

用您正在使用的数据库标记我们的问题。 您需要使用数据库进行标记是因为每个数据库都有非常不同的字符串和正则表达式 API。 如果你能够得到 ,222_444 ,只需删除第一组的第一个圆括号,你应该根据需要用 444 进行四舍五入 ,\d*(\d+[^]) 【参考方案1】:

我们可以尝试将REGEXP_REPLACE 与捕获组一起使用:

SELECT
    REGEXP_REPLACE( 
        '111_2222_33333,222_444_3,aaa_bbb_ccc',
        '^[^,]+,[^_]+_(.*?)_[^_]+,.*$',
        '\1') AS num
FROM yourTable;

这是一个演示,显示上述正则表达式的第一个捕获组包含您想要的数量。

Demo

【讨论】:

以上是关于正则表达式 - 在逗号之间的序列中捕获下划线之间的数字的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配逗号不在分组符号之间

用于在 = 和 ; 之间捕获单词的正则表达式

捕获可选连字符正则表达式之间的单词

Java 只有数字,字母,下划线,横杆,英文逗号的正则表达式

c#正则表达式捕获两个字符串之间的字符串[重复]

正则表达式 - 如果模式匹配,则替换双引号之间的字符(逗号)