首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mysql中模拟正则表达式捕获组

在mysql中模拟正则表达式捕获组
EN

Stack Overflow用户
提问于 2011-07-08 06:41:18
回答 1查看 6K关注 0票数 6

据我所知,MySQL不支持从正则表达式匹配中检索捕获组的值。我已经找到了一个可以添加此功能的服务器端扩展(lib_mysqludf_preg),但我无法在我的环境中安装此扩展。

因此,我正在寻找一种方法来模拟捕获正则表达式匹配的一部分作为SQL查询中的列。

我的数据如下所示(并且我不能更改服务器上的数据格式):

代码语言:javascript
复制
+-----------------------------+
| Version                     |
+-----------------------------+
| 1.2.3.4                     |
| 10.20.30.40                 |
| Obsidian-1.2.3.4            |
| Obsidian-11.21.31.41        |
| custom\Obsidian-11.21.31.41 |
| custom\11.21.31.41          |
+-----------------------------+

我希望从每一行捕获最后4位中的每一位。数字始终是值的最后一部分,并且它们始终用点分隔。下面的正则表达式将匹配我想要的所有值:

代码语言:javascript
复制
.*[[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+$

我希望得到的结果是一些函数的组合,可以捕获每个数字作为一列,这样我就可以在查询的where子句中使用数字,并能够获得版本号。

代码语言:javascript
复制
SELECT
    function1(...) as version1,
    function2(...) as version2,
    function3(...) as version3,
    function4(...) as version4
FROM Version
WHERE version1 > 5;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-08 22:19:46

经过反复试验,我想出了下面的查询,它能满足我的需求。基本上,我将数字从字符串的末尾分离出来,然后在分隔下一个数字之前删除这些字符。version1列被限制为正2位数字,但在我的例子中,这是一个我可以接受的限制。

代码语言:javascript
复制
SELECT
    IF(CAST(RIGHT(SUBSTRING_INDEX(LEFT(version,CHAR_LENGTH(version) - CHAR_LENGTH(SUBSTRING_INDEX(version, '.', -3)) - 1), '.', -1),2) AS DECIMAL) > 0, 
        CAST(RIGHT(SUBSTRING_INDEX(LEFT(version,CHAR_LENGTH(version) - CHAR_LENGTH(SUBSTRING_INDEX(version, '.', -3)) - 1), '.', -1),2) AS DECIMAL), 
        CAST(RIGHT(SUBSTRING_INDEX(LEFT(version,CHAR_LENGTH(version) - CHAR_LENGTH(SUBSTRING_INDEX(version, '.', -3)) - 1), '.', -1),1) AS DECIMAL)) AS version1,
    SUBSTRING_INDEX(LEFT(version,CHAR_LENGTH(version) - CHAR_LENGTH(SUBSTRING_INDEX(version, '.', -2)) - 1), '.', -1) as version2,
    SUBSTRING_INDEX(LEFT(version,CHAR_LENGTH(version) - CHAR_LENGTH(SUBSTRING_INDEX(version, '.', -1)) - 1), '.', -1) as version3,
    SUBSTRING_INDEX(version, '.', -1) as version4
FROM Version
HAVING version1 >= 5
;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6617996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档