在正则表达式中查找字符串(日期)的倒数第二个出现

Posted

技术标签:

【中文标题】在正则表达式中查找字符串(日期)的倒数第二个出现【英文标题】:Finding the second last occurrence of a string (date) in Regex 【发布时间】:2018-08-21 14:29:39 【问题描述】:

我得到了以下字符串:

(1640.31; 08/19/2016; 09/13/2016;); (250000.0; 09/30/2016; 02/17/2018;); (100000.0; 03/12/2018; 12/31/2025;);

或者

(1000000.0; 05/30/2018; 06/03/2028;);   

我需要返回倒数第二个日期,因此在这些情况下,例如 1:03/12/2018 和示例 2:05/30/2018。

因为有很多以 ; 结尾的字符串部分我不知道如何获得倒数第二个日期。

【问题讨论】:

日期总是mm/dd/yyyy;,精确为 2、2 和 4 位数字,正斜杠分隔符,分号终止? \(.+; ([0-9]2\/[0-9]2\/[0-9]4); ([0-9]2\/[0-9]2\/[0-9]4);\); 会给出三组,(外,一,二) 【参考方案1】:

以下 BigQuery 标准 SQL 示例

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '(1640.31; 08/19/2016; 09/13/2016;); (250000.0; 09/30/2016; 02/17/2018;); (100000.0; 03/12/2018; 12/31/2025;);' AS str UNION ALL
  SELECT '(1000000.0; 05/30/2018; 06/03/2028;);'
)
SELECT ARRAY_REVERSE(REGEXP_EXTRACT_ALL(str, r'\d\d/\d\d/\d\d\d\d'))[SAFE_OFFSET(1)] dt
FROM `project.dataset.table`   

结果:

Row dt   
1   03/12/2018   
2   05/30/2018   

注意:以上假设日期始终为 mm/dd/yyyy 或 dd/mm/yyyy 格式,但如果不同可以调整

【讨论】:

【参考方案2】:

我认为这是你想要的:

select (select array_agg(val order by o desc limit 2)  -- the limit is just for efficiency
        from unnest(split(str, ';')) val with offset o
        where val like '%/%/%'
       )[ordinal(2)] a
from (select '1640.31; 08/19/2016; 09/13/2016;' as str) x;

请注意,如果括号确实是字符串的一部分,这也(可能)与括号一起使用。

【讨论】:

以上是关于在正则表达式中查找字符串(日期)的倒数第二个出现的主要内容,如果未能解决你的问题,请参考以下文章

如何在倒数第二个 / 之前获取字符串

正则表达式()()12的用法

如何查找一行数据中倒数第二个非空单元格的内容呢?

Linux基础-sed+正则表达式

需要使用正则表达式找到2个字符串,并在它们之间插入多行文本并插入替换文本

如何进行正则表达式替换,在日期字符串中添加字符?