尝试使用正则表达式和公式拆分电子表格单元格中的所有 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)))),""))
我目前 运行 在 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)))),""))