代码之家  ›  专栏  ›  技术社区  ›  Lenni

Regex匹配Google Sheets中的重复子字符串

  •  4
  • Lenni  · 技术社区  · 1 年前

    我的数据总是以不带分隔符的重复两次的子字符串开始,然后是我不关心的其他数据。重复子串的长度各不相同,在下面的例子中,为了简单起见,我主要使用[a-z]字符,但在真实数据集中,重复子串大多是unicode波形。

    我的数据 我想提取什么
    johnjohnsajoalsas john
    peterpeteraaksoskco peter
    a8co.a8co.robinson a8co.
    robrob7s:s7 rob
    dkoisawks \[null\]

    这可以通过积极的展望轻松实现

    ^(.+)(?=\1)
    

    或者像这样直接引用捕获组

    ^(.+)\1
    

    然而,Google Sheets不支持这两种功能。

    任何帮助都会非常感激。

    3 回复  |  直到 1 年前
        1
  •  2
  •   rockinfreakshow    1 年前

    这里有一种方法( non-regex )您可以在表格中进行测试:

    =let(Λ,A2, Σ,map(sequence(rounddown(len(Λ)/2)),lambda(Σ,{left(Λ,Σ),left(Λ,Σ)=mid(Λ,Σ+1,Σ)})),
        ifna(+filter(Σ,index(Σ,,2)),"-"))
    

    enter image description here

    • 使用列出所有概率 left() mid() 过滤掉 可能的匹配(如果有的话)。。。
        2
  •  0
  •   Patrick Janser    1 年前

    我试过 谷歌工作表 并使用“ 搜索并替换 具有 ^(.{2,})\1(.*)$ 它奏效了。

    我测试过 (.*)\1 而且 (.*?)\1 正如你提到的,并且有效 它不起作用。

    它还应该与 ^(.+?)\1 。所以问题只是 * 将匹配零次,并且 + 会迫使至少匹配一个 烧焦

    所以由你来决定,但我认为名字应该是 可能超过2个字符,所以这就是为什么我更喜欢使用 .{2,} 甚至 \S{2,} 以确保匹配非空格。

    搜索 : ^(\S{2,})\1(.*)$

    代替 : $1

        3
  •  0
  •   z..    1 年前

    另一个解决方案:

    =LET(s,SEQUENCE(INT(LEN(A2)/2)),FILTER(LEFT(A2,s),LEFT(A2,s)=MID(A2,s+1,s)))
    

    enter image description here

    想法与其他用户相同。最多生成所有长度可能匹配的字符串 INT(LEN(str)/2) 只保留那些匹配的,如果有的话。

    例如,对于 johnjohnsajoalsas 我们检查以下字符串:

    enter image description here

    我们看到第4行有一个匹配项,所以我们保留该值并删除其他所有值。

    我们也可以用一个公式 C2 不需要使用拖动 MAP 作用

    =MAP(A2:A,LAMBDA(str,IF(str="",,LET(s,SEQUENCE(INT(LEN(str)/2)),
       FILTER(LEFT(str,s),LEFT(str,s)=MID(str,s+1,s))))))
    

    enter image description here