从string中提取子串的最后一个实例

时间:2017-08-17 04:49:51

标签: regex mariadb

这是我的哈希:

---
0:
  id: 11259
  year: 1997
  status: other
  priority: 
  created_at: !ruby/object:ActiveSupport::TimeWithZone
    utc: 2017-01-13 15:02:22.000000000 Z
    zone: !ruby/object:ActiveSupport::TimeZone
      name: Etc/UTC
    time: 2017-01-13 15:02:22.000000000 Z
  updated_at: !ruby/object:ActiveSupport::TimeWithZone
    utc: 2017-01-13 15:02:22.000000000 Z
    zone: !ruby/object:ActiveSupport::TimeZone
      name: Etc/UTC
    time: 2017-01-13 15:02:22.000000000 Z
1:
  id: 82829
  year: 1931
  status: won
  priority: 
  created_at: !ruby/object:ActiveSupport::TimeWithZone
    utc: 2017-01-13 15:02:22.000000000 Z
    zone: !ruby/object:ActiveSupport::TimeZone
      name: Etc/UTC
    time: 2017-01-13 15:02:22.000000000 Z
  updated_at: !ruby/object:ActiveSupport::TimeWithZone
    utc: 2017-01-13 15:02:22.000000000 Z
    zone: !ruby/object:ActiveSupport::TimeZone
      name: Etc/UTC
    time: 2017-01-13 15:02:22.000000000 Z

我想做两件事之一:

(1)提取'id's

id: 11259
id: 82829

(2)提取最后的'id':

id: 82829

到目前为止,我只能提取第一个 ID:

REGEXP_SUBSTR(hash_name, "id: .*?\n")

感谢。

2 个答案:

答案 0 :(得分:1)

如果您使用的是使用PCRE的MariaDB版本,则可以使用否定前瞻功能在匹配后排除id:

REGEXP_SUBSTR(hash_name, '(?s)id:[^\n]+(?!.*id:)')

(?s)将其置于DOTALL模式,以便.*匹配换行符。 (?!.*id:)是一个负面的预测,如果后面跟包含id:的任何内容,就会禁止匹配。 id:[^\n]*匹配id:,后跟可选的任何内容,直到换行符。

DEMO

答案 1 :(得分:0)

试试这个提供perl正则表达式访问权限的user defined function

PREG_CAPTURE(pattern, subject [, capture-group] [, occurence])

修改

PREG_CAPTURE("(?s)id:[^\n]+(?!.*id:)", hash_name)