簡體   English   中英

試圖從 Excel 中的單元格的開頭和結尾提取一串文本模式

[英]Trying to extract a string of text pattern from the beginning and the end of a cell in Excel

我有以下數據以及我希望在列結果中看到的內容:

數據 結果
PN 65011:2020text text text PN 65011:2020 PN 65011:2020, PN 65011:2020
PN 45014-1:2017 文本 文本 文本 文本 PN 65014-1:2017 PN 8726-1:2017/P11:2020 PN 45014-1:2017、PN 65014-1:2017、PN 8726-1:2017/P11:2020
PN 6534:2020文本文本文本文本 PN 6534:2020
PN 65014-1:2017 文本 文本 文本 文本 PN 65014-1:2017/PC1:2013 PN 65014-1:2017,PN 65014-1:2017/PC1:2013
PN ESO 67345:2019text text text PN 65018-1:2019/PC2:2020 PN ESO 67345:2019、PN 65018-1:2019/PC2:2020
PN ESO/EOC 5320:2013text text text PN ESO 27380:2019 PN 65015-1:2020/PC:2021 PN ESO/EOC 5320:2013、PN ESO 27380:2019、PN 65015-1:2020/PC:2021

我用過="PN "&TEXTJOIN(", PN ",1,IF(ISNUMBER(SEARCH("/",TRIM(MID(SUBSTITUTE(A2,"PN ",REPT(" ",LEN(A2))),(ROW(INDIRECT("1:"&LEN(A2))))*LEN(A2)-(LEN(A2)-1),LEN(A2))))),TRIM(MID(SUBSTITUTE(A2,"PN ",REPT(" ",LEN(A2))),(ROW(INDIRECT("1:"&LEN(A2))))*LEN(A2)-(LEN(A2)-1),LEN(A2))),LEFT(TRIM(MID(SUBSTITUTE(A2,"PN ",REPT(" ",LEN(A2))),(ROW(INDIRECT("1:"&LEN(A2))))*LEN(A2)-(LEN(A2)-1),LEN(A2))),MIN(IFERROR(FIND({" "},LOWER(TRIM(MID(SUBSTITUTE(A2,"PN ",REPT(" ",LEN(A2))),(ROW(INDIRECT("1:"&LEN(A2))))*LEN(A2)-(LEN(A2)-1),LEN(A2))))),""))-1)))

我幾乎得到了我想看到的內容,除了最后一行(PN ESO 5320:2013),我沒有得到數字。 它停在 PN ESO。 像這樣:

數據 結果
PN ESO/EOC 5320:2013 文本 PN ESO 27380:2019 文本 PN 65015-1:2020/PC:2021 PN ESO/EOC,PN ESO

關於如何獲得整個參考的任何想法?

非常感謝您提前。

這是一個關於如何使用 Excel O365 來解決此問題的示例

在此處輸入圖像描述

B2中的公式:

=TEXTJOIN(", ",,LET(X,FILTERXML("<t><s>"&SUBSTITUTE(A2,"PN ","</s><s>PN ")&"</s></t>","//s[position() > 1]"),Y,LEFT(X,FIND("|",SUBSTITUTE(X,":","|",LEN(X)-LEN(SUBSTITUTE(X,":",""))))+4),Y))

這里的想法是首先將“PN”的所有實例SUBSTITUTE()替換為有效的 xpath 構造。 然后我們使用FILTERXML()將所有值作為數組返回,顯然仍然是連接的“文本文本文本”。 因此,我使用LET()將數組作為變量加載,並對所有元素使用一些字符串操作。

首先,我將所有字符串中最后出現的冒號替換為管道符號,然后我們FIND()並返回它的 position。 現在我們有了可以使用LEFT()提取正確子字符串的位置。 使用TEXTJOIN()將結果數組重新連接在一起。

如果您可以接受 VBA 解決方案,則正則表達式非常適合此類問題。 如果您的示例都如您所見:

我們使用正則表達式來查找子字符串

  • 以 PN 開頭
  • 拿起以下字符,直到我們以冒號結尾,后跟多個數字。
  • 如果后面有/ ,則尋找下一個設置為冒號-多位數字的模式。

要輸入此用戶定義的 Function (UDF), <alt-F11>打開 Visual Basic 編輯器。 確保您的項目在 Project Explorer window 中突出顯示。 然后,從頂部菜單中,select插入/模塊並將下面的代碼粘貼到打開的 window 中。

要使用此用戶定義的 Function (UDF),請在某個單元格中輸入類似=extrPN(cell_Ref)的公式。

Option Explicit
Function extrPN(S As String) As String
    Dim RE As Object, MC As Object, M As Object
    Const sPat As String = "PN[^:]+:\d+(?:/[^:]+:\d+)?"
    Dim sTemp As String
    
Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .Pattern = sPat
    .ignorecase = False
    If .Test(S) = True Then
        Set MC = .Execute(S)
            For Each M In MC
                sTemp = sTemp & ", " & M
            Next M
            extrPN = Mid(sTemp, 3)
    Else: extrPN = "no match"
    End If
End With
End Function

在此處輸入圖像描述

正則表達式的解釋

提取PN

PN.*?:\d+(?:/[^:]+:\d+)?

選項:不區分大小寫; ^$ 匹配換行符

使用RegexBuddy創建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM