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

时间:2012-01-06 05:49:34

标签: regex google-sheets

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

2 个答案:

答案 0 :(得分:13)

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

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

将返回数组:

{bra,bra}

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

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

将返回字符串:

...BRA...BRA

答案 1 :(得分:2)

以下是两个解决方案,一个使用作者示例中的特定术语,另一个扩展了作者的样本正则表达式模式,似乎与所有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

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

Cell 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(外观顺序丢失)。这使用"(文胸)。*(文胸)"修复了前一个答案的缺点。在那个孤立的ERC或DIELCO仍然可以匹配。

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

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

结果:

ERC DIELCO