2017-08-17 37 views
0

这里是我的散列:提取最后一个实例

--- 
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: 11259 
id: 82829 

( 2)仅提取最终'id':

id: 82829 

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

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

感谢。

+0

您确定您使用的是MySQL吗?它没有'REGEXP_SUBSTR()'函数。该功能仅存在于Oracle和MariaDB中。 – Barmar

+0

MariaDB使用PCRE,因此您可以使用负面预测来查找字符串后面没有另一个“id:”后面的'id:'。然后它会匹配字符串中的最后一个'id:'。 – Barmar

回答

1

如果您在使用使用PCRE一个MariaDB的版本,可以使用负前瞻比赛结束后排除id:

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

(?s)将其放入DOTALL模式,使得跨换行符.*匹配。 (?!.*id:)是一种否定性的前瞻,如果后面跟着包含id:的任何内容,则不允许匹配。并且id:[^\n]*匹配id:,然后是可选的任何内容,直到换行符为止。

DEMO

+0

完美,谢谢@Barmar – huey

+0

如果它解决了这个问题,你应该接受答案 – Barmar

0

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

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

编辑:

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

你会如何使用它来查找重复任意次数的最后一次事件? – Barmar

+0

“从pcre模式中捕获一个命名或数字加括号的子表达式。从正则表达式的特定匹配或第一个匹配中捕获未被指定。 –

+0

这不能回答我的问题。你将如何创建一个可匹配任意数量的组的正则表达式,然后如何知道哪个出现数是最后一个? – Barmar

相关问题