Excel中查找,从右向左查找

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_

我希望从长的非结构化文本中解析出一段特定的文本。我要捕获的部分总是有一个“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_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