使用正则表达式从 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 列中提取子字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式从 Ruby 中的字符串中提取子字符串

如何使用正则表达式或子字符串从字符串中提取文本?

使用正则表达式从句子中的方括号中提取剩余的子字符串

正则表达式无法从字符串中提取双参数子字符串

Java使用正则表达式提取字段分隔的子字符串

在普通bash中使用正则表达式提取子字符串