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拆分成由单独的单词组成的数组,由
space
或underscore
分隔 - 寻找一个匹配模式
nnnxnnn
定义如下:- 以数字开头
- 然后是小写的
x
(如果x
可以是任何一种情况,则用下面的公式中的SEARCH
replaceFIND
) - 以数字结尾
- 该函数将返回匹配该模式的string中的最后一个单词。
该公式包括几个“子公式”
我们通过space
和underscore
将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/(...)
然后将返回1
或DIV/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式)在单元格内和循环中