根据另一个值提取字符串的一部分

Extract part of string based on the value of another

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

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))

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

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

但通常对于这种情况,最好使用正则表达式来帮助...

首先需要准备正则表达式VBA函数。在 VBA 引用中,添加 "Microsoft VBScript Regular Expression 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
' as first bracket
    ThisRE.Pattern = PatternStr
    ThisRE.Global = True
    ReplaceRE = ThisRE.Replace(FromStr, ByStr)
End Function

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

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

C2公式复制下来:

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

就避免子字符串匹配问题而言,这是一种更稳健的方法,它假设您的数据与您显示的一样一致。

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

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