这可以通过公式来完成,但这完全取决于您的 Excel 版本:
1)Excel 2016,您仍然可以使用公式:
公式为B1
:
=IFERROR(MID(A1,MAX((MID(A1,ROW(A$1:INDEX(A:A,LEN(A1))),1)="1")*(ISNUMBER(--MID(A1,ROW(A$1:INDEX(A:A,LEN(A1))),8)))*(NOT(ISNUMBER(--MID(A1,ROW(A$1:INDEX(A:A,LEN(A1)))+8,1))))*(NOT(ISNUMBER(--MID(A1,ROW(A$1:INDEX(A:A,LEN(A1)))-1,1))))*(ROW(A$1:INDEX(A:A,LEN(A1))))),8),"Nothing found")
Note: This is an array formula and needs to be confirmed through CtrlShiftEnter
2)Excel 2019,使用CONCAT() https://support.microsoft.com/en-gb/office/concat-function-9b1a9a3f-94ff-41af-9736-694cbd6b4ca2 and FILTERXML() https://support.microsoft.com/en-us/office/filterxml-function-4df72efc-11ec-4951-86f5-c1374812f5b7:
公式为B1
:
=IFERROR(FILTERXML("<t><s>"&CONCAT(IF(ISNUMBER(--MID(A1,ROW(A$1:INDEX(A:A,LEN(A1))),1)),MID(A1,ROW(A$1:INDEX(A:A,LEN(A1))),1),"</s><s>"))&"</s></t>","//s[starts-with(., '1') and string-length(.) =8]"),"Nothing Found")
Note: This is an array formula and needs to be confirmed through CtrlShiftEnter
3)Excel 365,使用前面提到的函数,但包括SEQUENCE() https://support.microsoft.com/en-us/office/sequence-function-57467a98-57e0-4817-9f14-2eb78519ca90:
公式为B1
:
=IFERROR(FILTERXML("<t><s>"&LET(X,MID(A1,SEQUENCE(LEN(A1)),1),CONCAT(IF(ISNUMBER(--X),X,"</s><s>")))&"</s></t>","//s[starts-with(., '1') and string-length(.) =8]"),"Nothing Found")
The XPATH
部分公式负责实际查询,查找以“1”开头且总长度为“8”的字符串。这甚至可以使用像“abc123456789abc12345678abc29876543”这样的字符串,返回“12345678”。
如果你喜欢FILTERXML
and XPATH
,那么你可能会发现this https://stackoverflow.com/q/61837696/9758194有趣的。
4)Excel 365,内部人士版(撰写本文时)使用TEXTSPLIT() https://support.microsoft.com/en-us/office/textsplit-function-b1ca414e-4c21-4ca0-b1b7-bdecace8a6e7:
=LET(X,MID(A1,SEQUENCE(LEN(A1)),1),Y,TEXTSPLIT(A1,IF(ISNUMBER(--X)," ",X),,1),FILTER(Y,(--LEFT(Y)=1)*(LEN(Y)=8),"Nothing Found"))
5)VBA:如果您必须使用 VBA,我想 UDF 是一个不错的选择。就像是:
Function GetStr(str As String, pat As String) As String
With CreateObject("vbscript.regexp")
.Pattern = pat
.Global = True
If .Test(str) = True Then
GetStr = .Execute(str)(0).Submatches(0)
Else
GetStr = "Nothing found"
End If
End With
End Function
你可以调用这个B1
as per =GetStr(A1,"(?:^|\D)(1\d{7})(?:\D|$)")
。这是利用正则表达式。如果您有兴趣并想了解更多信息,那么this https://stackoverflow.com/q/22542834/9758194对您来说是一本有趣的读物。
我故意将该模式留在 UDF 之外,您可能想更改它。目前的模式可以在网上看到Demo https://regex101.com/r/ZotvZK/1,引擎将从左到右寻找:
-
(?:
- 1st Non-capturing group
-
^|\D
- 起始字符串锚或数字以外的任何内容。
-
)
- 关闭第一个非捕获组。
-
(
- 1st capture group.
-
1\d{7}
- 搜索文字 1 后跟 7 位数字。
-
)
- 关闭第一个捕获组。
-
(?:
- 2nd Non-capturing group
-
\D|$
- 除数字或结尾字符串锚点之外的任何内容。
-
)
- 关闭第二个非捕获组。