使用正则表达式从 mysql 列中提取子字符串
Posted
技术标签:
【中文标题】使用正则表达式从 mysql 列中提取子字符串【英文标题】:extract substring from mysql column using regex 【发布时间】:2017-07-18 22:37:38 【问题描述】:我的正则表达式是
(pnr|(P|p)[ _.:,!"'-/$](N|n)[ _.:,!"'-/$](R|r))+[ _.:,!"'-/$]+[0-9]3[ _.:,!"'-/$]+[0-9]7
它正在从列中提取 pnr 编号。
示例文本:
94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding pnr:986-097832
94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: pnr:986-097832 text/plain; charset=UTF-8\r\nContent-Transfer-Encoding
pnr:986-097832 94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding
我必须创建一个只提取 pnr 号码的 mysql 查询
【问题讨论】:
【参考方案1】:SELECT REGEXP_SUBSTR(column, 'pnr:[0-9\-]10')
FROM table
【讨论】:
欢迎来到 Stack Overflow!感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。 简洁明了。REGEXP_SUBSTR
仅适用于 mysql >= 8.0 !【参考方案2】:
试试 SUBSTRING_INDEX
SELECT
SUBSTRING_INDEX(
SUBSTRING_INDEX('94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding pnr:986-097832', 'pnr:', -1), ' ',1);
SELECT
SUBSTRING_INDEX(
SUBSTRING_INDEX('94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: pnr:986-097832 text/plain; charset=UTF-8\r\nContent-Transfer-Encoding', 'pnr:', -1), ' ',1);
SELECT
SUBSTRING_INDEX(
SUBSTRING_INDEX('pnr:986-097832 94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding', 'pnr:', -1), ' ',1);
样本
mysql> SELECT
-> SUBSTRING_INDEX(
-> SUBSTRING_INDEX('94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: pnr:986-097832 text/plain; charset=UTF-8\r\nContent-Transfer-Encoding', 'pnr:', -1), ' ',1);
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| SUBSTRING_INDEX(
SUBSTRING_INDEX('94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: pnr:986-097832 text/plain; charset=UTF-8\r\nContent-Transfer-Encoding', 'pnr:', -1), ' ',1) |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 986-097832 |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0,00 sec)
mysql>
mysql> SELECT
-> SUBSTRING_INDEX(
-> SUBSTRING_INDEX('pnr:986-097832 94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding', 'pnr:', -1), ' ',1);
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| SUBSTRING_INDEX(
SUBSTRING_INDEX('pnr:986-097832 94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding', 'pnr:', -1), ' ',1) |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 986-097832 |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0,00 sec)
mysql>
【讨论】:
我正在尝试使用 substring_index 但我必须将它与正则表达式一起使用,因为 pnr 可以是 p:n:r 或 PNR 或 p.n.r : 123-3123212 @Sunil Harak - 您可以尝试像这样规范化“pnr”并将其放入我的查询中 SELECT REPLACE( REPLACE( REPLACE('pnr:986-097832 94eb2c0cb17ef354bb052c57f40c\r\nContent-类型:text/plain; charset=UTF-8\r\nContent-Transfer-Encoding' ,'p:n:r','PNR') ,'pnr','PNR') ,'pnr','PNR '); @Sunil Harak - 或者如果您使用 MariaDB,您可以直接使用 REGEXP_SUBSTR 参见:mariadb.com/kb/en/mariadb/regexp_substr 适用于旧版本的 Mysql(对我来说是 5.0.x) 某些用户可能会寻找什么! (因为旧文档不再在线) 这里是给老杜库的dev.mysql.com/doc/index-archive.html【参考方案3】:对于 Oracle,我们可以执行以下操作 -
SQL> create table test2( id varchar2(2000));
Table created.
SQL> insert into test2 values ('pnr:986-097831 94eb2c0cb17ef354bb052c57f40c\r\nC
ontent-Type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding');
1 row created.
SQL> insert into test2 values('94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: pnr
:986-097832 text/plain; charset=UTF-8\r\nContent-Transfer-Encoding')
2 ;
1 row created.
SQL> insert into test2 values('94eb2c0cb17ef354bb052c57f40c\r\nContent-Type: tex
t/plain; charset=UTF-8\r\nContent-Transfer-Encoding pnr:986-097833');
1 row created.
SQL> select regexp_substr( id, '(P|p)(N|n)(R|r):[0-9]*\-[0-9]*' ) PNR FROM test2;
PNR
----------------
pnr:986-097831
pnr:986-097832
pnr:986-097833
SQL>
`
【讨论】:
感谢您的回复:),但我想要它用于 mysql以上是关于使用正则表达式从 mysql 列中提取子字符串的主要内容,如果未能解决你的问题,请参考以下文章