【问题标题】:Finding texts in between 2 words when there's more than 2 same words当有超过 2 个相同的单词时,查找 2 个单词之间的文本
【发布时间】:2024-01-09 23:46:01
【问题描述】:

我正在尝试在 2 个单词之间获取文本。当有 2 个完全相同的单词时,我很难获取文本。在这种情况下,“版本”。我在 A 列中有以下文字。

Abc Authentic Desktop 2022 Enterprise Edition Concurrent Users
Abc DiffMerge 2022 Professional Edition Named Users
Abc Flow Server 2022 Advanced Edition 2 Core One Year
Upgrade From Abc XML 2004 Professional Edition To Abc XML 2022 Enterprise Edition Concurrent Users

我想从这些产品名称中提取版本,如下所示。

Enterprise Edition
Professional Edition
Advanced Edition
Enterprise Edition

如果我在下面使用这个公式,除了最后一个在字符串中有 2 个版本之外,它都可以工作。

=MID(A1,FIND("2022",A1)+5,FIND("Edition ",A1)+2-FIND("2022",A1))

我也想得到版本之后的单词(第 4 项的第 2 版)。 您能否建议如何编写公式以在字符串中使用第 2 版?

【问题讨论】:

    标签: excel function excel-formula find


    【解决方案1】:

    如果你有 Windows Excel 2013+ 的功能,你可以使用:

    =FILTERXML("<t><s>" &SUBSTITUTE(A1," ","</s><s>")& "</s></t>","//s[.='Edition'][last()]/preceding::*[1]") & " Edition"
    

    提取上一个版本

    上述的一种变体,但在此实现中需要 Windows Office 365,以返回字符串中的最后一个版本以及之后的所有内容:

    =LET(x,"<t><s>" &SUBSTITUTE(A1," ","</s><s>")& "</s></t>",
         y,FILTERXML(x,"//s[.='Edition'][last()]/preceding::*[1]"),
         z, FILTERXML(x,"//s[.='Edition'][last()]/preceding::*[1]/following-sibling::*"),
         TEXTJOIN(" ",TRUE,y,z))
    

    正如@JvdV 所指出的,第二个公式可以通过使用不同的xPath 参数来简化为使用单个FILTERXML 调用:

    =TEXTJOIN(" ",TRUE,FILTERXML("<t><s>" &SUBSTITUTE(A1," ","</s><s>")& "</s></t>","//s[following::*[2]='Edition'][last()]/following::*"))
    

    它仍然需要TEXTJOIN,如果我没记错的话,它直到 Excel 2019 才出现。

    编辑: 似乎需求描述最初是不完整的。 OP真正想要的是拥有

    • B1中以Edition之前的单词开头的两个单词
    • C1Edition 之后的所有单词

    既然如此,公式是:

    B1:  =TEXTJOIN(" ",TRUE,FILTERXML("<t><s>" &SUBSTITUTE(A1," ","</s><s>")& "</s></t>","//s[.='Edition'][last()]/preceding::*[2]/following::*[position()<3]"))
    
    C1:  =TEXTJOIN(" ",TRUE,FILTERXML("<t><s>" &SUBSTITUTE(SUBSTITUTE(A1,"(",UNICHAR(8203)&"(")," ","</s><s>")& "</s></t>","//s[.='Edition'][last()]/following::*"))
    

    注意C1 公式中嵌套的SUBSTITUTE 函数。通过插入非打印字符 (ZWSP),我们欺骗函数将 (1) 视为文本字符串,而不是数字 -1,从而在输出中保留括号

    【讨论】:

    • 非常好+。如果您允许的话,但也许第二个公式可以表述为:=TEXTJOIN(" ",,FILTERXML("&lt;t&gt;&lt;s&gt;"&amp;SUBSTITUTE("a "&amp;A1," ","&lt;/s&gt;&lt;s&gt;")&amp;"&lt;/s&gt;&lt;/t&gt;","//s[following::*[2]='Edition'][last()]/following::*")),这样可以避免嵌套的FILTERXML() 操作。
    • @JvdV 非常非常好。昨晚摆弄xPath试图消除嵌套操作,但是时间不早了,开发不出来了。
    • @JvdV 为什么"a "&amp;A1 而不是SUBSTITUTE 函数中的A1
    • 我把它放在那里,以防 OP 有一个像“企业版并发用户”这样的字符串。它只会在“Edition”前面有一个兄弟姐妹,这意味着它会引发错误。虽然不太可能,但基本上只是为了防止错误;)
    • @JvdV 啊,很好。我不认为字符串的开头很重要,因为他的“为一个版本工作”代码正在寻找所需字符串之前的一串数字。
    最近更新 更多