Excel-从字母数字字符串中提取所有数字

Excel-从字母数字字符串中提取所有数字,excel,xml,xpath,filter,excel-formula,Excel,Xml,Xpath,Filter,Excel Formula,背景 我知道如何使用TEXTJOIN()和SUBSTITUTE()等函数从字母数字字符串中提取所有数字。不过,我对非数组输入的方式感兴趣,并认为可以通过FILTERXML()来完成,因为我正在尝试学习更多关于该主题的知识 Excel的功能从Excel 2013开始提供(非在线或Mac),并支持XPATH 1.0。因此,我试图实现可以找到的双重技巧 问题 那么,如何通过Excel中的XPATH使用doubletranslate()函数将所有非数字字符转换为字符串呢 | Sample | D

背景

我知道如何使用
TEXTJOIN()
SUBSTITUTE()
等函数从字母数字字符串中提取所有数字。不过,我对非数组输入的方式感兴趣,并认为可以通过
FILTERXML()
来完成,因为我正在尝试学习更多关于该主题的知识

Excel的功能从Excel 2013开始提供(非在线或Mac),并支持
XPATH 1.0
。因此,我试图实现可以找到的双重技巧


问题

那么,如何通过Excel中的
XPATH
使用double
translate()
函数将所有非数字字符转换为字符串呢

| Sample    | Desired Output |
|-----------|----------------|
| aBc1d5_x9 | 159            |
| 12:2&0    | 1220           |
| ABC123    | 123            |

我试过:
=FILTERXML(“&A2&”,“//s[translate(,translate(,'0123456789','','',''))”)
。但是,这将返回与
A2
完全相同的值(未更改)。不受支持的
XPATH
函数或错误语法通常会返回
#值
错误。因此,这看起来确实是受支持的,但在我的语法中,我出了问题,但我猜不到。

免责声明:这个答案与XPath无关,但提供了一个单单元格、非数组输入的问题解决方案

使用Office 365,不再需要数组输入公式。使用新的Filter()函数,所有操作都可以在一个单元格中完成

使用新的Let()函数(目前在Insider preview中),公式可能比以前需要的要短得多

=LET(MyText,MID(A1,ROW(INDIRECT("A1:A"&LEN(A1))),1),
TEXTJOIN("",TRUE,FILTER(MyText,(CODE(MyText)<=57)*(CODE(MyText)>=48))))+0
=LET(我的文本,中间(A1,行(间接)(“A1:A”)和LEN(A1)),1),
TEXTJOIN(“),TRUE,过滤器(MyText,(代码(MyText)=48))+0

如果还没有LET(),请使用较长的版本

=TEXTJOIN("",TRUE,FILTER(MID(A1,ROW(INDIRECT("A1:A"&LEN(A1))),1),(CODE(MID(A1,ROW(INDIRECT("A1:A"&LEN(A1))),1))<=57)*(CODE(MID(A1,ROW(INDIRECT("A1:A"&LEN(A1))),1))>=48)))+0
=TEXTJOIN(“,TRUE,过滤器(中间(A1,行(间接的)(“A1:A”和LEN(A1))),1),(代码(中间(A1,行(间接的)(“A1:A”和LEN(A1))),1))=48))+0
这也适用于Excel在线和移动设备


如果希望结果为文本,请删除公式末尾的
+0

免责声明:此答案与XPath无关,但提供了一个单单元格、非数组输入的问题解决方案

使用Office 365,不再需要数组输入公式。使用新的Filter()函数,所有操作都可以在一个单元格中完成

使用新的Let()函数(目前在Insider preview中),公式可能比以前需要的要短得多

=LET(MyText,MID(A1,ROW(INDIRECT("A1:A"&LEN(A1))),1),
TEXTJOIN("",TRUE,FILTER(MyText,(CODE(MyText)<=57)*(CODE(MyText)>=48))))+0
=LET(我的文本,中间(A1,行(间接)(“A1:A”)和LEN(A1)),1),
TEXTJOIN(“),TRUE,过滤器(MyText,(代码(MyText)=48))+0

如果还没有LET(),请使用较长的版本

=TEXTJOIN("",TRUE,FILTER(MID(A1,ROW(INDIRECT("A1:A"&LEN(A1))),1),(CODE(MID(A1,ROW(INDIRECT("A1:A"&LEN(A1))),1))<=57)*(CODE(MID(A1,ROW(INDIRECT("A1:A"&LEN(A1))),1))>=48)))+0
=TEXTJOIN(“,TRUE,过滤器(中间(A1,行(间接的)(“A1:A”和LEN(A1))),1),(代码(中间(A1,行(间接的)(“A1:A”和LEN(A1))),1))=48))+0
这也适用于Excel在线和移动设备


如果希望结果为文本,请删除公式末尾的
+0

根据您的excel版本,您可以使用:

=CONCAT(IF(ISNUMBER(-MID(A2,SEQUENCE(LEN(A2)),1)),MID(A2,SEQUENCE(LEN(A2)),1),""))


一、 同样,我们也无法弄清楚如何将
translate
FILTERXML
一起使用。它似乎可以与在线xpath测试仪(与1.0兼容)配合使用,但似乎无法与Excel配合使用。

根据您的Excel版本,您可以使用:

=CONCAT(IF(ISNUMBER(-MID(A2,SEQUENCE(LEN(A2)),1)),MID(A2,SEQUENCE(LEN(A2)),1),""))


一、 同样,我们也无法弄清楚如何将
translate
FILTERXML
一起使用。它似乎可以与在线xpath测试人员(与1.0兼容)一起使用,但与Excel不兼容。

感谢您的测试。这可能是一只虫子吗?你的公式是一个不错的选择。@JvdV我不知道。我还没有找到使用带有
FILTERXML/xPath
参数的函数的MS文档。但是某些XPath1.0函数似乎不起作用,即使它们在这方面可以正常工作。在您的例子中,语法应该是
//s/translate(,,translate(,'0123456789','','')
,但这不适用于Excel。--><代码>#值玩弄
translate
让我相信我们只能使用
FILTERXML
从XML中选择节点。数据转换似乎是不允许的=(感谢您测试Ron。这可能是一个bug吗?不过您的公式是一个不错的选择。@我不知道JvdV。而且我还没有找到使用带有
FILTERXML/xPath
参数的函数的MS文档。但是某些xPath 1.0函数似乎不工作,即使它们在这方面工作正常。在您的情况下,语法应该是
//s/translate。)(,,translate(,'0123456789','','')
,但这不适用于Excel。-->
#VALUE!
玩弄
translate
让我相信我们只能使用
FILTERXML
从XML中选择节点。数据转换似乎是不允许的=(