regex BigQuery SQL:- 识别字符串中一行中的相同数字

cyvaqqii  于 2023-06-30  发布在  其他
关注(0)|答案(3)|浏览(143)

我想使用SQL Bigquery来识别一个字符串在一行中有相同的数字超过4次。示例:

AAAAAB - true
BBBBAA - false
111111 - true
01010101010101 - false

到目前为止,我已经用regex尝试了不同的方法,但没有一种方法有好的结果。

regexp_contains(mycolumn,r'[0-9]\\1{4}') --- gives me false as an output
regexp_contains(mycolumn,r'(\d)*(\d){4}')  --- returns true to every string as long it has more than 4 digits
REGEXP_CONTAINS(mycolumn, '')), r'(\d)1{4}') --same
regexp_contains(mycolumn,r'(\d){4}')`

我知道我可以使用CASESUBSTRING,但如果我能找到一个更好的解决方案,而不需要10行代码来解决一个“简单”的问题,那将是理想的。
感谢大家的参与。

alen0pnh

alen0pnh1#

\1back-reference 用于引用一个捕获组-将[0-9]放在圆括号( )内。
此外,对于 raw string literalr'',您不需要转义值-额外的\将生成一个包含文字\字符的模式。

  • "...我想识别一个字符串中相同的数字超过4次..."*
([0-9])\1{4}

最后,你提到 AAAAAB 应该是真的。
您可以将A-Z范围添加到 character class

([0-9A-Z])\1{4}
jucafojl

jucafojl2#

考虑以下方法(BigQuery标准SQL)

SELECT mycolumn, MAX(size) > 4 AS result
FROM (
  SELECT mycolumn, COUNT(*) size
  FROM (
    SELECT *, COUNTIF(new_group) OVER(PARTITION BY mycolumn ORDER BY OFFSET) AS group_num,
    FROM (
      SELECT *, IFNULL(x != LAG(x) OVER(PARTITION BY mycolumn ORDER BY OFFSET), TRUE) new_group,
      FROM (
        SELECT mycolumn, OFFSET, x
        FROM your_table, UNNEST(SPLIT(mycolumn, '')) x WITH OFFSET
      )
    )
  )
  GROUP BY mycolumn, group_num
)
GROUP BY mycolumn

如果应用于问题中的样本数据-输出为

rta7y2nd

rta7y2nd3#

在给出第一个答案后-上床睡觉时得到了更好的解决方案-见下文(仍然是BigQuery标准SQL)

SELECT mycolumn, 
  LOGICAL_OR(REGEXP_CONTAINS(mycolumn, r'' || x || '{5,}')) AS result
FROM your_table, UNNEST(SPLIT(mycolumn, '')) x
GROUP BY mycolumn

如果应用于问题中的样本数据-输出为

P.S.我用下面的测试

WITH your_table AS (
  SELECT 'AAAAAB' AS mycolumn UNION ALL
  SELECT 'BBBBAA' UNION ALL
  SELECT '111111' UNION ALL
  SELECT '01010101010101'
)
SELECT mycolumn, LOGICAL_OR(REGEXP_CONTAINS(mycolumn, r'' || x || '{5,}')) AS result
FROM your_table, UNNEST(SPLIT(mycolumn, '')) x
GROUP BY mycolumn

附言2
如果你有长字符串-使用下面的优化版本

SELECT mycolumn, 
  LOGICAL_OR(REGEXP_CONTAINS(mycolumn, r'' || x || '{5,}')) AS result
FROM (
  SELECT DISTINCT mycolumn, x
  FROM your_table, UNNEST(SPLIT(mycolumn, '')) x
)
GROUP BY mycolumn

相关问题