【问题标题】:Can MySQL return the portion of the string matching a regular expression?MySQL可以返回匹配正则表达式的字符串部分吗?
【发布时间】:2020-04-13 08:12:53
【问题描述】:

我想在正则表达式中使用组捕获来解析字符串。这可以用 MySQL 完成吗?

例如,

SELECT my_wishful_function('->hello world<-', '/->(.*)<-/')

并让它返回:

hello world

【问题讨论】:

标签: mysql sql regex


【解决方案1】:

一个优雅的解决方案是使用REGEXP_SUBSTR() 和积极的前瞻/后向断言:

SELECT REGEXP_SUSBSTR('->hello world<-', '(?<=->).*(?=<-)');
-- hello world

(?&lt;=...) 是一个肯定的后向断言:我们检查匹配模式前面是...

(?=...) 是一个肯定的前瞻断言:我们检查匹配模式后跟...

这些断言没有被捕获,所以我们不需要删除分隔符-&gt;&lt;-

兼容 MySQL 8

【讨论】:

    【解决方案2】:

    在 MySQL 5.7 中,如果边界 -&gt;&lt;- 在字符串中只出现一次,您可以使用 SUBSTRING_INDEX 两次来提取边界之间的部分:

    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('I said ->hello world<- today', '->', -1), '<-', 1)
    

    输出

    hello world
    

    【讨论】:

      【解决方案3】:

      MySQL 正则表达式引擎不支持反向引用,这与 Oracle 或 Postgres 等其他 RDBMS 不同。

      您可以改用regexp_replace()。也就是说,删除不需要的部分而不是捕获想要的部分:

      select regexp_replace('->hello world<-', '(^->)|(<-$)', '')
      

      正则表达式解释:^-&gt;是字符串开头不需要的部分,&lt;-$是字符串末尾不需要的部分。我们用括号将部分括起来来定义组,并用|分隔它们,这意味着

      Demo on DB Fiddle

      select regexp_replace('->hello world<-', '(^->)|(<-$)', '') new_col
      
      | new_col | | :------------ | |你好世界|

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 2012-11-25
      • 2015-10-25
      相关资源
      最近更新 更多