【问题标题】:How can I use regexextract function in Google Docs spreadsheets to get "all" occurrences of a string?如何在 Google Docs 电子表格中使用 regexextract 函数来获取字符串的“所有”出现?
【发布时间】:2025-12-17 03:55:02
【问题描述】:

我的文本字符串在单元格 D2 中:

Decision, ERC Case No. 2009-094 MC, In the Matter of the Application for Authority to Secure Loan from the National Electrification Administration (NEA), with Prayer for Issuance of Provisional Authority, Dinagat Island Electric Cooperative, Inc. (DIELCO) applicant(12/29/2011)

这个函数:

=regexextract(D2,"\([A-Z]*\)")

会抓住 (NEA) 但不会抓住 (DIELCO)

我希望它同时提取 (NEA) 和 (DIELCO)

【问题讨论】:

标签: regex google-sheets


【解决方案1】:

您可以使用捕获组,这将导致regexextract() 返回一个数组。您可以将其用作单元格结果,在这种情况下,您将获得一系列结果,或者您可以将数组提供给另一个函数以根据您的目的重新格式化它。例如:

regexextract( "abracadabra" ; "(bra).*(bra)" )

将返回数组:

{bra,bra}

另一种方法是使用regexreplace()。这样做的好处是替换是全局的(比如s/pattern/replacement/g),所以你不需要提前知道结果的数量。例如:

regexreplace( "aBRAcadaBRA" ; "[a-z]+" ; "..." )

将返回字符串:

...BRA...BRA

【讨论】:

  • 轰隆隆!选项 1 完美地满足了我的需求。谢谢,元编辑
  • 哎呀。实际上,我需要研究一下。如果有多个匹配项,则该解决方案有效;它返回所有这些。但如果只有一个匹配项,则返回无。
  • 这是想出最适合您目的的正则表达式的问题。 “选项 1”有两个捕获组,适用于出现两次的字符串。如果出现次数未知,请考虑“选项 2”。
  • 所以在没有多个捕获组的情况下,使用 regexextract 仍然无法提取多个匹配项?
【解决方案2】:

这里有两种解决方案,一种使用作者示例中的特定术语,另一种扩展作者的示例正则表达式模式,该模式似乎匹配所有 ALLCAPS 术语。我不确定哪个是想要的,所以我都给了。

(将文本块放入A1)

ALLCAPS 中所有单词的通用解决方案

=regexreplace(regexreplace(REGEXREPLACE(A1,"\b\w[^A-Z]*\b","|"),"\W+","|"),"^\||\|$","")

结果:

ERC|MC|NEA|DIELCO

注意:首当其冲的是大写公式,小写函数仅用于清理。

如果要空格分隔,公式就简单一点:

=trim(regexreplace(REGEXREPLACE(A1,"\b\w[^A-Z]*\b"," "),"\W+"," "))

结果:

ERC MC NEA DIELCO

(我喜欢在谷歌电子表格中使用正则表达式的一种方法是从另一个单元格中读取正则表达式模式,这样我就可以更改它而无需使用该模式编辑或重新粘贴到所有单元格中。看起来是这样的:

单元格 A1:

Block of text

单元格 B1(无引号):

\b\w[^A-Z]*\b

公式,在任何单元格中:

=trim(regexreplace(REGEXREPLACE(A1,B$1," "),"\W+"," "))

通过将其锚定到 B$1,我可以一次填充所有行,并且引用不会增加。)


上一个答案:

选定术语的特定解决方案(ERC、DIELCO)

=regexreplace(join("|",IF(REGEXMATCH(A1,"ERC"),"ERC",""),IF(REGEXMATCH(A1,"DIELCO"),"DIELCO","")),"(^\||\|$)","")

结果:

ERC|DIELCO

和以前一样,首当其冲的是大写公式,小写函数只是为了清理。

此公式将在文本块中查找任何 ERC 或 DIELCO,或两者。初始顺序无关紧要,但输出始终是 ERC 后跟 DIELCO(出现顺序丢失)。这修复了上一个使用“(bra).*(bra)”的答案的缺点,因为孤立的 ERC 或 DIELCO 仍然可以匹配。

这也有一个更简单的空格分隔形式:

=trim(join(" ",IF(REGEXMATCH(A1,"ERC"),"ERC",""),IF(REGEXMATCH(A1,"DIELCO"),"DIELCO","")))

结果:

ERC DIELCO

【讨论】:

  • 我意识到我完全错过了原始问题中的关键细节,并重新修改了我的答案。我最终的通用解决方案是:=JOIN(", ",SPLIT(REGEXREPLACE(REGEXREPLACE($A$1,"(^.*?\(|\).*?\(|\).*?$)","|"),"[^A-Z]+","|"),"|")),它给出了这个结果:NEA,DIELCO。它的工作原理是首先删除没有被括号包围的所有内容:(first regex = |NEA|DIELCO|12/29/2011|),然后删除所有不是全大写单词的内容:(second regex = |NEA|DIELCO|),最后拆分和重新加入以获得漂亮的格式。谷歌表在这里:goo.gl/3nJcFe
【解决方案3】:

请尝试:

=SPLIT(regexreplace(A1 ; "(?s)(.)?\(([A-Z]+)\)|(.)" ; "?$2");"?")

=REGEXEXTRACT(A1;"\Q"&REGEXREPLACE(A1;"\([A-Z]+\)";"\\E(.*)\\Q")&"\E")

【讨论】:

    最近更新 更多