问题 如何在Google Docs电子表格中使用regexextract函数来获取字符串的“全部”出现?


我的文本字符串在单元格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)


6229
2018-01-06 05:49


起源

我认为 webapps.stackexchange.com 是Google文档使用问题的推荐位置。 - Steve-o


答案:


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

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

将返回数组:

{bra,bra}

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

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

将返回字符串:

...BRA...BRA

13
2018-01-06 07:46



繁荣!选项1完美地完成了我需要的工作。谢谢,MetaEd - nicknich3
糟糕!实际上,我需要研究一下。如果有多个匹配,该解决方案有效;它返回所有这些。但如果只有一个匹配,则返回none。 - nicknich3
这是一个提出最适合您目的的正则表达式的问题。 “选项1”具有两个捕获组,并使用具有两次出现的字符串。如果出现次数未知,请考虑“选项2”。 - MetaEd
所以使用regexextract仍然没有办法拉出多个匹配,没有多个捕获组? - chrismarx


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

(将文本块放在A1中)

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

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

结果:

ERC|MC|NEA|DIELCO

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

如果你想要空间分离,公式有点简单:

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

结果:

ERC MC NEA DIELCO

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

单元格A1:

Block of text

Cell 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

和以前一样,工作首当其冲的是CAPITALIZED公式,小写函数只是用于清理。

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

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

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

结果:

ERC DIELCO

2
2018-01-19 01:08



我意识到我完全错过了原始问题中的关键细节,并重新设计了我的答案。我的最终通用解决方案是这样的: =JOIN(", ",SPLIT(REGEXREPLACE(REGEXREPLACE($A$1,"(^.*?\(|\).*?\(|\).*?$)","|"),"[^A-Z]+","|"),"|")) 这给出了这个结果: NEA,DIELCO。它的工作原理是首先删除未被括号括起来的所有内容:(第一个正则表达式= | NEA | DIELCO | 12/29/2011 |),然后删除所有不是ALLCAPS字样的东西:(第二个正则表达式= | NEA | DIELCO |),最后分裂并重新加入以获得良好的格式。 Google表格在这里: goo.gl/3nJcFe - Dannid