Excel Mid Find查找,从右到左

我正在从长的非结构化文本中parsing出一段特定的文本。 我想要捕捉的部分总是在其左侧和右侧都有一个整数“x”。

这是我的公式:

=IFERROR(SUBSTITUTE(RIGHT(LEFT(G2,FIND("x",G2)-1),FIND("_",G2)-3)&MID(G2,FIND("x",G2),FIND("_",G2)-2),"_",""),"1x1") 

和另一个版本,我试图处理与OR语句空间(这是行不通的)

 =IFERROR(SUBSTITUTE(RIGHT(LEFT(G4,FIND("x",G4)-1),FIND(OR("_"," "),G4)-3)&MID(G4,FIND("x",G4),FIND("_",G4)-2),"_",""),"1x1") 

原始文本 – 我的公式结果 – 期望的结果

 Q1-Q4_Year_Source_Type_P_LongName_300x250_Target_Server 300x250 300x250 Q1-Q4_Year_Client_Client Year_Type_P_LongName_1600x1000_Site_Server 600x100 1600x1000 02.04 Search Sponsorship - 728x90 1x1 728x90 Some Website_300x600 ROS Display ebsite300x600 ROS Di 300x600 

理想情况下,如果我能够从右到左而不是从左到右阅读MID公式MID(G2,FIND("x",G2),FIND("_",G2)-2) ,我想我会保持良好状态

谢谢。

有一个从string中提取数字的标准公式(在许多变体中find): –

 =LOOKUP(99^99,--("0"&MID(A1,MIN(SEARCH({0,1,2,3,4,5,6,7,8,9},A1&"0123456789")),ROW($1:$15)))) 

所以你可以使用这个开始几个字符的左边的“X”,然后从“X”本身。 build议使用这些辅助单元来避免长公式,所以如果你的原始string在A1: –

 =mid(A1,find("x",A1)-5,999) in B1 =mid(A1,find("x",A1),999) in C1 

然后是D1中的第一个数字

 =LOOKUP(99^99,--("0"&MID(B1,MIN(SEARCH({0,1,2,3,4,5,6,7,8,9},B1&"0123456789")),ROW($1:$15)))) 

和E1中的第二个数字

 =LOOKUP(99^99,--("0"&MID(C1,MIN(SEARCH({0,1,2,3,4,5,6,7,8,9},C1&"0123456789")),ROW($1:$15)))) 

并将它们连接在一起:

 =D1&"x"&E1 

在这里输入图像说明

这是一个复杂的公式

  • 将string拆分成由单独的单词组成的数组,由spaceunderscore分隔
  • 寻找一个匹配模式nnnxnnn定义如下:
    • 以数字开头
    • 然后是小写的x (如果x可以是任何一种情况,则用下面的公式中的SEARCHreplaceFIND
    • 以数字结尾
  • 该函数将返回匹配该模式的string中的最后一个单词。

该公式包括几个“子公式”

我们通过spaceunderscore将string拆分成一个单词数组:

 =TRIM(MID(SUBSTITUTE(SUBSTITUTE(A1,"_"," ")," ",REPT(" ",99)),SEQ,99)) 

在上面的SEQ是一个命名公式:( Formulas ► Define Name

  =IF((ROW(INDEX(Sheet1!$1:$65536,1,1):INDEX(Sheet1!$1:$65536,255,1))-1)*99=0,1,(ROW(INDEX(Sheet1!$1:$65536,1,1):INDEX(Sheet1!$1:$65536,255,1))-1)*99) 

该公式生成一系列数字1,99,198,297, ...这为第一个公式中的MID函数提供了一个很好的起点。

然后,我们使用LEFT和MID函数来查找包含x的单词,并在x之前和之后有数字

 ISNUMBER(-LEFT(TRIM(MID(SUBSTITUTE(SUBSTITUTE(A1,"_"," ")," ",REPT(" ",99)),SEQ,99)),FIND("x",TRIM(MID(SUBSTITUTE(SUBSTITUTE(A1,"_"," ")," ",REPT(" ",99)),SEQ,99)))-1)) ISNUMBER(-MID(TRIM(MID(SUBSTITUTE(SUBSTITUTE(A1,"_"," ")," ",REPT(" ",99)),SEQ,99)),FIND("x",TRIM(MID(SUBSTITUTE(SUBSTITUTE(A1,"_"," ")," ",REPT(" ",99)),SEQ,99)))+1,99))) 

乘以这两个公式将返回匹配或不匹配模式的单词的0和1的数组。

 1/(...) 

然后将返回1DIV/0错误的数组。

使用LOOKUP的向量forms将返回与我们的模式匹配数组中匹配位置相同的位置的string数组中的值。

 =LOOKUP(2,1/(ISNUMBER(-LEFT(TRIM(MID(SUBSTITUTE(SUBSTITUTE(A1,"_"," ")," ",REPT(" ",99)),SEQ,99)),FIND("x",TRIM(MID(SUBSTITUTE(SUBSTITUTE(A1,"_"," ")," ",REPT(" ",99)),SEQ,99)))-1))*ISNUMBER(-MID(TRIM(MID(SUBSTITUTE(SUBSTITUTE(A1,"_"," ")," ",REPT(" ",99)),SEQ,99)),FIND("x",TRIM(MID(SUBSTITUTE(SUBSTITUTE(A1,"_"," ")," ",REPT(" ",99)),SEQ,99)))+1,99))),TRIM(MID(SUBSTITUTE(SUBSTITUTE(A1,"_"," ")," ",REPT(" ",99)),SEQ,99))) 

在这里输入图像说明

我会注意到,使用VBA和正则expression式,相同的模式可以表示为\d+x\d+

用户自定义函数可以用来完成同样的事情,一旦你stream利的话,花费很less的时间来devise。

 Option Explicit Function ExtractMeasure(S As String) As String Dim RE As Object, MC As Object Set RE = CreateObject("vbscript.regexp") With RE .Pattern = "\d+x\d+" .Global = False .ignorecase = False 'Case Sensitive If .test(S) = True Then Set MC = .Execute(S) ExtractMeasure = MC(0) End If End With End Function 

在这种情况下,最好在EXCEL中使用正则expression式。 在EXCEL中使用正则expression式请参考下面的文章。 但是,你必须为此使用VBA。 如何在Microsoft Excel中使用正则expression式(正则expression式)在单元格内和循环中