代码之家  ›  专栏  ›  技术社区  ›  A. K.

尝试使用正则表达式和公式拆分电子表格单元格中的所有4位数字

  •  1
  • A. K.  · 技术社区  · 7 年前

    我目前在谷歌电子表格中使用拆分和正则表达式时遇到了一些困难。我试图在一行中分割一个单元格的内容,但只提取四个连续数字(代表年份)的序列,并且只使用单元格公式(而不是函数)。最终,这个公式将适用于整个列,但我暂时将其限制为单个单元格。例如,给定一个包含以下内容的单元格I2:

    我需要一个结果(放置在J2、K2、L2、M2等中),如:

    2009 1939 1945 1984

    尽管分号之间的条目数从一个到多个不等,但这个样本单元格对于可能出现的各种可能性来说都具有代表性。到目前为止,在我自己的尝试中,我最终得到了两个公式,它们接近我所需要的,但都达不到要求。

    1) 第一个公式是:

    实现(在“J2,K2,L2,M2,N2”中):

    2009 1939 1945 231984 16

    2) 第二个公式是:

    2009 1939 1945 23 1984 16

    例如,我一直在想一种方法来限制带有“\d{4}”的公式返回,但迄今为止,我所做的任何组合或修改都没有成功。有人有什么见解可以解决这个问题吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Ron Rosenfeld    7 年前

    下面的方法似乎有效,尽管我不是图纸专家,可能还有更有效的方法。

    REGEXEXTRACT

    =REGEXEXTRACT($I2,REPT("(\b\d{4}\b).*?",(len($I2)-len(REGEXREPLACE($I2,"\b\d{4}\b","")))/4))
    

    工作原理:

    =(len(I2)-len(REGEXREPLACE(I2,"\b\d{4}\b","")))/4
    

    接下来,创建包含正则表达式的正则表达式,次数正确:

    REPT("(\b\d{4}\b).*?", ...Above_formula...)
    

    最后,我们把所有这些放在上面的最终公式中。

    知道

    如果没有匹配项,为了消除不需要的零,请使用 REGEXMATCH

    =ArrayFormula(if(REGEXMATCH($I2,"\b\d{4}\b"),(value(REGEXEXTRACT($I2,REPT("(\b\d{4}\b).*?",(len($I2)-len(REGEXREPLACE($I2,"\b\d{4}\b","")))/4)))),""))
    
        2
  •  1
  •   ttarchala    7 年前

    使用此公式,可以将冒号替换为拆分字符,使用源字符串中不太可能出现的另一个字符。

    =filter(split(regexreplace(I$2, "\D+", ":"), ":"), len(split(regexreplace(I$2, "\D+", ":"), ":"))=4)
    

    说明:这是一种绕过谷歌RE2引擎中正则表达式限制的方法。我们不寻找模式,而是寻找反模式(任何不是数字的东西),并用分隔符替换它,然后分割。剩下的只是由数字组成的子串,所以我们对它们进行过滤,使其只剩下4个字符的子串。