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

Attempting to split all 4 digit numbers in spreadsheet cells with regex and formulas

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

2009; Library of Congress; 1939-1945; 23rd 1984; 16

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

2009 1939 1945 1984

尽管分号之间的条目数从一个到多个不等,但据我所知,此示例单元格具有代表性,代表了可能出现的各种可能性。到目前为止,在我自己的尝试中,我得到了两个接近我需要的公式,但都达不到要求。

1)第一个公式为:

=ArrayFormula(SPLIT(SUBSTITUTE(REGEXREPLACE(I, "[^\d\-\;]", ""),"-", ";"), ";"))

实现(在"J2, K2, L2, M2, N2"):

2009 1939 1945 231984 16

2) 第二个公式为:

=ArrayFormula(SPLIT(SUBSTITUTE(REGEXREPLACE(REGEXREPLACE(I, "[^\d]", ";"), "[^\d\-\;]", ""),"-", ";"), ";"))

这让我(在 "J2, K2, L2, M2, N2, O2"):

2009 1939 1945 23 1984 16

我一直在想办法用“\d{4}”来限制公式的returns,但是到目前为止我所做的组合或修改都没有成功.有没有人有解决这个问题的见解?

使用这个公式,也许将冒号替换为另一个不太可能出现在源字符串中的字符。

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

说明:这是解决 Google RE2 引擎中正则表达式限制的方法。我们不是寻找模式,而是寻找反模式(任何不是数字的东西)并将其替换为分隔符,然后拆分。剩下的只是由数字组成的子串,所以我们过滤它们,只剩下4个字符的子串。

以下似乎可行,虽然我不是表格专家,但可能还有更有效的方法。

显然,如果您使用捕获组,REGEXEXTRACT 将 return 一个值数组。但是,此方法似乎要求您知道要提取的匹配项的确切数量。

因此以下似乎有效:

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

工作原理:

First compute the number of matches in the string:

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

Next, create a regex expression incorporating the regex the correct number of times:

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

最后,我们将它们放在上面的最终公式中。

当然,如果您知道匹配的数量总是四 (4),就没有必要以这种方式构造正则表达式字符串,您可以硬编码。

编辑 如果没有匹配项,要消除不需要的零,请使用 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)))),""))