【问题标题】:Identifying records where string is made up of repeating characters识别字符串由重复字符组成的记录
【发布时间】:2020-08-01 05:05:54
【问题描述】:

我有兴趣识别字符串由 1 个重复字符组成的记录,例如 'AAA'、'ZZZZZ'、'EE' 但不是 'A'、'HELLO'、'APPLE'、'AABB'、'MM ALBERT'

以下正则表达式在我测试时有效^(.)\1{1,}$ https://regex101.com/r/dT6dK8/46 但是当我在雪花中使用它时它不起作用。 任何建议将不胜感激。

我在 Snowflake 中测试的内容

SELECT 'AA' regexp '^(.)\1{1,}$' -- AS 'EXPECT TRUE'
       ,'AAA' regexp '^(.)\1{1,}$' -- AS 'EXPECT TRUE'
       ,'A' regexp '^(.)\1{1,}$' -- AS 'EXPECT FALSE'
       ,'AAAAA' regexp '^(.)\1{1,}$' -- AS 'EXPECT TRUE'
       ,'BBBB' regexp '^(.)\1{1,}$' -- AS 'EXPECT TRUE'
       ,'AABB' regexp '^(.)\1{1,}$' -- AS 'EXPECT FALSE'
       ,'HELLO' regexp '^(.)\1{1,}$' -- AS 'EXPECT FALSE'       
       ,'AAAAA' regexp '^(.)\1{1,}$' -- AS 'EXPECT TRUE'
       ,'BB BB' regexp '^(.)\1{1,}$' -- AS 'EXPECT FALSE'
;

参考文献 Regex to determine if string is a single repeating character

【问题讨论】:

  • '^(.)\\1+$' 工作吗?
  • @WiktorStribiżew 很遗憾没有。

标签: regex snowflake-cloud-data-platform


【解决方案1】:

不使用正则表达式:

SELECT col, REPLACE(col, LEFT(col,1), '') = '' AND LENGTH(col) > 1
FROM (SELECT 'AA' AS col UNION ALL SELECT 'HELLO') t;

db<>fiddle demo

如果使用空字符串的第一个字符替换返回空字符串,则表示所有字符串都相同。

【讨论】:

  • 那是聪明的解决方案。如果字符串由所有相同的字符组成,则将第一个字符替换为所有 '' 将使其成为空字符串。但是,这并不能解决允许单字符字符串的情况。其中“A”是有效条目
  • 这不适用于由单个字符组成的字符串。您可能需要在字符串长度上添加条件。
  • IF(LEN(col) = 1, col, REPLACE(col, LEFT(col,1), '')) 将解决 1 个字母的问题。
  • 感谢您的挑剔和两个想法:)
  • 通过添加 AND 语句可以轻松解决单字符问题。我很感激帮助。不过我仍然很好奇,为什么它不适用于 Snowflake 但在正则表达式测试器中
猜你喜欢
  • 2018-12-07
  • 2022-01-16
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多