【问题标题】:Extract part of string based on the value of another根据另一个字符串的值提取字符串的一部分
【发布时间】:2020-03-09 15:35:39
【问题描述】:

我想根据大型数据集中另一个单元格中另一个字符串的条件提取字符串的一部分。 我有:

V1                 V2
Tom Cruise         Tom Cruise (movie 1), Al Pacino (movie 2), Johnny Depp (movie 5)
Johnny Depp        Tom Bennet (movie 3, movie 4), Johnny Depp (movie 5)
Emma Watson        Al Pacino (movie 8), Emma Watson (movie 1, movie 3), Antony B. (movie 5)

我需要创建一个基于 V1 的新字段,它将报告 V1 名称旁边括号之间的文本。生成的数据集需要:

V1                 V2                                                                           V3
Tom Cruise         Tom Cruise (movie 1), Al Pacino (movie 2), Johnny Depp (movie 5)             movie 1
Johnny Depp        Tom Bennet (movie 3, movie 4), Johnny Depp (movie 5)                         movie 5
Emma Watson        Al Pacino (movie 8), Emma Watson (movie 1, movie 3), Antony B. (movie 5)     movie 1, movie3

我尝试了函数 =LEFT 和 FIND 的组合,但仍然出现错误。

=LEFT(V1, FIND( " (", V2))

【问题讨论】:

  • 您的第二个样本与第一个相同。
  • 请注意,根据您的数据集,当某个名称可能是较长名称的子字符串时,您可能会得到不需要的结果。只是FIND 不会防错

标签: excel string excel-formula substring extract


【解决方案1】:

C2的公式复制下来:

=MID(B2,FIND(A2,B2)+LEN(A2)+2,FIND(")",B2,FIND(A2,B2))-FIND("(",B2,FIND(A2,B2))-1)

【讨论】:

    【解决方案2】:

    一个丑陋的一步公式(可能是一个漂亮的解决方案)是:

    =MID(B2,FIND("), "&A2&" (","), "&B2)+LEN(A2)+2,FIND(")",B2,FIND("), "&A2&" (","), "&B2)+1)-FIND("), "&A2&" (","), "&B2)-LEN(A2)-2)
    

    但是通常对于这样的情况,还是使用正则表达式来帮助...

    首先,你需要准备正则表达式VBA函数。在 VBA 参考中,添加“Microsoft VBScript 正则表达式 5.5”。然后将其添加到一些您将继续用作 Excel 插件的 .xlam 文件中,或者将其放入本地的 .xlsm 工作簿中。

    Public ThisRE As New RegExp
    
    Public Function ReplaceRE(ByVal FromStr As String, ByVal PatternStr As String, ByVal ByStr As String) As String
    '$1 as first bracket
        ThisRE.Pattern = PatternStr
        ThisRE.Global = True
        ReplaceRE = ThisRE.Replace(FromStr, ByStr)
    End Function
    

    使用正则表达式的公式是:

    =ReplaceRE(B3,"^.*(^|, )"&A3&" \(([^)]+)\).*","$2")
    

    【讨论】:

      【解决方案3】:

      在避免子字符串匹配问题方面,这种方法稍微稳健一些,假设您的数据与您显示的一样一致。

      =TRIM(LEFT(SUBSTITUTE(TRIM(MID(SUBSTITUTE(V2,V1&" (",REPT(" ",99)),99,99)),")",REPT(" ",99)),99))

      根据实际布局更改V1和V2。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-25
        • 2020-12-18
        • 1970-01-01
        相关资源
        最近更新 更多