在 Excel 电子表格中,我有一列混合文本字符串,其中包含项目主数据(类型、项目编号、地址、主题等)。我需要从此字符串中自动提取项目编号。一个问题是该数字位于字符串的不同位置。我猜这会使使用 =MID() 变得困难。另一个问题是该数字的长度各不相同。
3 个字符串的示例:
发票号2014-0406-1 Main Street,John Nelson,购买
税projno 2015-0021拒绝申请
gl oldroad 10案例2014-0306-003 HUKO,JFR
从我需要提取的字符串中:
2014-0406-1
2015-0021
2014-0306-003
我希望这可以自动完成。提前感谢您的帮助!:)
答案1
看起来,当您感兴趣的字符串可以直接附加到文本(如您的第一个例子)时,这实际上可能有点困难。如果项目编号的末尾不是这种情况,并且它们总是以空格结尾,并且您同意使用从 2000 年起考虑项目编号的解决方案,您可以尝试:
=MID(A1,SEARCH("20??-",A1),FIND(" ",A1,SEARCH("20??-",A1))-SEARCH("20??-",A1))
请注意,使用 Microsoft365 可以将其简化为:
=LET(X,SEARCH("20??-",A1),MID(A1,X,FIND(" ",A1,X)-X))
如果这太过简化,您可能会遇到类似“test-test test2014-0406-5test 2020”等极端情况,您可以尝试:
=@LET(X,MID(A1,SEQUENCE(LEN(A1)),1),FILTERXML("<t><s>"&CONCAT(IF(ISNUMBER(FIND(X,"0123456789-")),X,"</s><s>"))&"</s></t>","//s[contains(., '-')][translate(.,'-','')*0=0]"))
编辑:
请注意,您也可以使用正则表达式,但这需要您使用 VBA。也许以下 UDF 可以做到:
Function GetProjectID(str As String, pat As String) As String
With CreateObject("vbscript.regexp")
.Pattern = pat
If .Test(str) Then GetProjectID = .Execute(str)(0)
End With
End Function
调用方式=GetProjectID(A1,"\d+-\d+(?:-\d+)*")