我有一个正则表达式.*\/(\d+)(?![^(]*\)),它可以在其他程序中工作,例如,C#.我想在MYSQL中使用它,它返回错误

SELECT REGEXP_SUBSTR(myStr, '.*\/(\d+)(?![^(]*\))'), c.* FROM mytable c;
/* SQL Error (1139): Regex error 'unmatched closing parenthesis at offset 16' */

正则表达式实际上会返回如下结果.它得到了最后一个"/"旁边的数字,而不是在括号内

e.g.,
string: "/13/A01(VE)(S)", expected result: "13"
string: "(2)/1(D/3G)", expected result: "1"
string: "/S03(RED/09)/1/(TN)", expected result: "1"
string: "/2(V)/8", expected result: "8"
string: "/BR03(JTF07)(CE)(W)/9", expected result: "9"
string: "(NT)/2(U/V)(J)", expected result: "2"

推荐答案

正则表达式的问题是,\d\)在正则表达式中出现为d)(由于正则表达式引擎之前的字符串解析),后者随后在下一个)处导致"不匹配的右括号"错误.你需要逃脱\,以确保你得到\d\)到正则表达式,即:

'.*/(\\d+)(?![^(]*\\))'

假设你使用的是MySQL 8.0.4,当切换到ICU引擎时,这将正常工作,尽管它会给你一个字符串,以/后面的最后一个数字结尾,但不是在括号内.>然后你只需要提取这些数字,你可以用另一个正则表达式来完成:

\\d+$

在SQL中:

SELECT REGEXP_SUBSTR(REGEXP_SUBSTR(myStr, '.*/(\\d+)(?![^(]*\\))'), '\\d+$') FROM myTable;

演示dbfiddle.uk

Mysql相关问答推荐

Select 一对列存在最短日期的记录列

SQL中的搜索模式

用于将重复行的唯一列值作为单独列获取的SQL查询

MySQL滑动窗口动态间隔?

如何在 MySQL 中对同一个表的多个列进行 INNER JOIN

Eloquent:通过国外模型得到平均分

使用 presto 或 mysql 添加每个组中的缺失值

global max_connections 和 spring.hikari.maximumPoolSize 有什么区别?

为什么没有创建此触发器?

在 Codeigniter MySQL 中从另一个数据库获取数据

用两个新列制作表格,按偶数或奇数对另一列进行分类,并将一个类别中的所有偶数和奇数相加

是否可以从 .SQL 文件中计算表中的行数?

如何在 MySQL 中删除具有 2 列作为复合主键的多行?

通过数据库级​​别本身的查询反序列化

MySQL PHP - Select WHERE id = array()?

从 MYSQL 查询中计算列的平均值

从mysql中的大表中快速 Select 随机行

phpMyAdmin - 无法连接 - 无效设置 - 自从我添加了 root 密码 - 被锁定

MySQL术语约束与外键的区别?

如何将数组存储到mysql中?