问题描述
我正在尝试提取在Google表格单元格的公式中显示的所有单元格/范围地址。
自然界中的公式可能非常复杂。我尝试了许多模式,这些模式可以在网络测试仪中使用,但不适用于Google Sheets re2。
以下示例显示了两个问题。也许我看错了匹配结果,但是据我了解,有4个匹配项。
公式(忽略逻辑):
=A$13:B4+$BC$12+$DE2+F2:G2
正则表达式:
((\$?[A-Z]+\$?\d+)(:(\$?[A-Z]+\$?\d+))?)
预期结果:
[A$13:B4,$BC$12,$DE2,F2:G2]
Here(如果我没有误读结果)看起来不错。 我不确定显示的组匹配是否也被视为匹配项,因为它说明了“ 4个匹配项,287个步骤”
但是在Google表格中会返回所有匹配1 结果
[A$13:B4,A$13,:B4,B4]
其他匹配项将被忽略 所以我想问题是如何将正则表达式转换为re2语法?
更新: 在player0评论之后,也许我不清楚。 这只是一个简单的示例,以隔离我遇到的其他问题。这只是一个包含一些相对和绝对格式的地址的字符串。 但是,我正在寻找更广泛的通用解决方案,以适合任何可能包含公式和对其他图纸的引用的公式。例如:
=(STDEVA(Sheet1!B2:B5)+sum($A$1:$A$2))*B2
这里的预期结果是Sheet1!B2:B5,$A$1:$A$2,B2
此公式包含两个公式,并引用另一张纸。 在这里仍然从命名范围和其他公式中忽略了我目前无法想到的可能参考。 另外,方括号 [] 无关紧要,这只是显示结果的一种方式,实际上是从Logs复制的,因为这都是在脚本中完成的。
解决方法
尝试:
=INDEX(SUBSTITUTE(TEXTJOIN(",",1,IFNA(REGEXEXTRACT(SPLIT(SUBSTITUTE(FORMULATEXT(A3),"'","♥"),"+-*/^()=<>&"),"(?:.+!)?[A-Z$]+\d+(?::[A-Z$](?:\d+)?)?|(?:.+!)?[A-Z$]:[A-Z$]+"))),"♥","'"))
或更长时间:
=INDEX(SUBSTITUTE(TEXTJOIN(",IFNA(IFNA(REGEXEXTRACT(SPLIT(SUBSTITUTE(FORMULATEXT(A3),"+-*/^()=<>"),"(?:.+!)?[A-Z$]+\d+(?::[A-Z$](?:\d+)?)?"),REGEXEXTRACT(SPLIT(SUBSTITUTE(FORMULATEXT(A3),"(?:.+!)?[A-Z$]:[A-Z$]+")))),"'"))
,
似乎可以使用
[A-Z$]+\d+(?::[A-Z$]\d+)?
,
通过使用/g
标志,我想出了一种更好的方法而不拆分。
但是,这在脚本中有效,而不是通过使用Sheets内部的正则表达式函数(即REGEXEXTRACT
)来实现,因为我不知道如何在包含/ g标志和{{ 1}}将接受为有效的正则表达式。
这是代码:
REGEXEXTRACT
NamedRanges使它变得有些复杂。 此代码将进行匹配和分析,并返回一个列表,其中包含所有先前的地址,包括NamedRanges的地址。