Excel中查找,从右向左查找
我希望从长的非结构化文本中解析出一段特定的文本。我要捕获的部分总是有一个“x”,其左右两侧都有整数 这是我的公式:Excel中查找,从右向左查找,excel,parsing,text,find,Excel,Parsing,Text,Find,我希望从长的非结构化文本中解析出一段特定的文本。我要捕获的部分总是有一个“x”,其左右两侧都有整数 这是我的公式: =IFERROR(SUBSTITUTE(RIGHT(LEFT(G2,FIND("x",G2)-1),FIND("_",G2)-3)&MID(G2,FIND("x",G2),FIND("_",G2)-2),"_",""),"1x1") 还有另一个版本,我试图用OR语句处理空格(这不起作用) 原始文本-我的公式结果-所需结果 Q1-Q4_Year_Source_Type_P_
=IFERROR(SUBSTITUTE(RIGHT(LEFT(G2,FIND("x",G2)-1),FIND("_",G2)-3)&MID(G2,FIND("x",G2),FIND("_",G2)-2),"_",""),"1x1")
还有另一个版本,我试图用OR语句处理空格(这不起作用)
原始文本-我的公式结果-所需结果
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)
从右到左而不是从左到右读取,我想我的状态会很好
谢谢。在这种情况下,最好在EXCEL中使用正则表达式。请参阅下面关于在EXCEL中使用正则表达式的帖子。但是,您必须使用VBA进行此操作。
从字符串中提取数字有一个标准公式(在许多变体中都有):- 所以你可以从“x”左边的几个字符开始,然后从“x”本身开始。建议对这些字符串使用辅助单元格,以避免长公式,因此,如果原始字符串位于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
这里有一个复杂的公式
- 将字符串拆分为单个单词的数组,用
或空格
下划线
- 查找与模式
匹配的单词,该模式定义为:nnnxnnn
- 以数字开头
- 后跟小写的
(如果x
可以是任意一种情况,请在下面的公式中将x
替换为FIND
)SEARCH
- 以数字结尾
- 函数将返回字符串中与该模式匹配的最后一个单词
空格
和下划线
将字符串拆分为一个单词数组:
=TRIM(MID(SUBSTITUTE(SUBSTITUTE(A1,"_"," ")," ",REPT(" ",99)),SEQ,99))
在上面的SEQ
中有一个命名公式:(公式► 定义名称
)
该公式生成一系列数字1,99198297,…
,为第一个公式中的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(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和正则表达式,相同的模式可以用\d+x\d+
一个用户定义的函数也可以用来完成同样的事情,一旦你掌握了流利的语言,就只需要花一小部分时间来设计
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
我知道您正在使用公式,但是VBA解决方案可以吗?
1/(...)
=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)))
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