我在开放式办公室有一个专栏,如下所示:
abc-23
abc-32
abc-1
现在,我只需要使用 calc 中的公式和正则表达式来获得数字 23、32 和 1 的总和。我怎么做?
我试过
=SUMIF(F7:F16,"([:digit:].)$")
但不知何故,这不起作用。
我在开放式办公室有一个专栏,如下所示:
abc-23
abc-32
abc-1
现在,我只需要使用 calc 中的公式和正则表达式来获得数字 23、32 和 1 的总和。我怎么做?
我试过
=SUMIF(F7:F16,"([:digit:].)$")
但不知何故,这不起作用。
从 LibreOffice 6.4 开始,您可以使用新添加的REGEX 函数通过正则表达式从单元格/文本中提取所有数字:
=REGEX(A1;"[^[:digit:]]";"";"g")
替换A1
为要从中提取数字的单元格引用。
REGEX
函数参数说明:参数用分号隔开;
A1
:从中提取数字的值。可以是单元格引用 (like A1
) 或引用的文本值 (like "123abc"
)。以下正则表达式将应用于此单元格/文本。"[^[:digit:]]"
: 匹配每一个不是十进制数字的字符。另请参阅LibreOffice 中的正则表达式列表
[]
封装了要搜索的字符列表^
添加一个NOT ,表示搜索列表中未包含的每个字符都匹配[:digit:]
代表任何十进制数字""
: 用空替换匹配的字符(每个非数字)=删除它们"g"
: 替换所有匹配项(不要在第一个非数字字符后停止)不幸的是,Libre-Office 仅在查找/替换和搜索中支持正则表达式。如果这是一次性交易,我会将 A 列复制到 B 列,然后在 B 中使用 [data] [text to columns] 并使用 - 作为分隔符,将 B 列中的所有文本和C列中的数字。
或者,您可以在 B 列中使用 =Right(A1,find("-",A1,1)+1),然后对 C 列求和。
我认为这并不完全是您想要的,但也许它可以帮助您或其他人。
这一切都是关于substring
(在Calc
被调用的[MID][1]
函数中):
首先:选择您的单元格(例如带有“ abc-23
”内容)。
其次:输入起始长度(" british
" --> start length 4 = tish
)。
之后:要打印所有剩余的文本,您可以在参数中使用[LEN][2]
带有单元格(“”)的函数(称为长度)abc-23
。代码现在看起来像这样:
D15="abc-23"
=MID(D15; 5; LEN(D15))
输出是:23
当您编辑数字时(在此示例中为 23),没问题。但是,如果您在之前更改任何内容(文本“ abc-
”),算法就会崩溃,因为开始长度被定义为“5”。
将字符串粘贴到单元格中,打开搜索和替换对话框 (ctrl + f) 扩展搜索选项标记正则表达式搜索 ([\s,0-9])([^0-9\s])+ 并将其替换为1美元
根据您的需要调整正则表达式
我没有弄清楚如何直接在 OpenOffice/LibreOffice 中执行此操作。在网上搜索和尝试各种公式时遇到挫折后,我意识到我的工作表是一个简单的 CSV 格式,所以我在 vim 中打开它,并使用 vim 内置的类似 sed 的功能在 vim 命令模式下查找/替换文本:
:%s/abc-//g
这仅对我有用,因为没有其他列具有此匹配文本。如果有其他列具有相同的文本,那么解决方案会更复杂一些。
如果您的工作表不是 CSV,您可以将列复制到文本文件并使用 vim 查找/替换,然后将数据粘贴回电子表格。对我来说,这比试图在 LibreOffice 中解决这个问题更令人沮丧……
在不知道是否真的有兴趣的情况下,我不会为解决方案而烦恼,但是,您可以编写一个宏来执行此操作。提取所有数字,然后通过检查文本中包含的数字来实现总和。