2017-12-02 188 views
1

我期待與多個字母大寫單詞的第一個實例後,細胞分裂。VBA - 正則表達式拆分可變

實施例1:

輸入1:樓層4 InformatiqueNoosavilleSep

希望的輸出1:NoosavilleSep

圖樣:的應該分裂中的最後一個字出現在大寫的第二實例。 「InformatiqueNoosavilleSep」

實施例2:

輸入:樓層13個InformatiqueSurfers ParadiseSep

輸出:衝浪者ParadiseSep

圖樣:不應該發生在分割最後一個字,但在「InformatiqueSurfers」而不是。

的問題:該圖案以找到分裂字從另一個小區而不同。

我們知道:

1:如果最後一個字包含三個大寫字母,它總是在這個詞,我們要拆分的string.Example1

2:如果最後一個字只包含兩個大寫字母「ParadiseSep」,我們必須在它之前的單詞上分割字符串。例題

我發現這個代碼,允許與大寫鎖定分割字符串,並添加一個空格。

Dim objRegex As Object 
Set objRegex = CreateObject("vbscript.regexp") 
With objRegex 
    .Global = True 
    .Pattern = "([a-z])([A-Z])" 
    SplitCaps = .Replace(strIn, "$1 $2") 
End With 
End Function 

因爲我正在學習VBA,所以這個正則表達式已經有點超出了我的境界。

感謝您的閱讀!

+0

這似乎更像是一個正則表達式的解析問題,儘管我不是專家。換句話說:從最後開始找到「單詞」。如果它有三個帽子,然後在那裏分割。否則,找到最後一個詞並在那裏分開。 –

+0

也許是這樣的https://regex101.com/r/aW2enR/3。看看你的原始問題,似乎需求可能會隨着你遇到不同的邊緣情況而不斷變化 – Slai

+0

定義它的另一種方式是,新值只是「Informatique」之後的單元格值的一部分? –

回答

0

試試這個:

Function afterFirstUpperCaseWord(strIn As String) 
    Dim objRegex As Object 
    Set objRegex = CreateObject("vbscript.regexp") 
    With objRegex 
     .Global = True 
     .Pattern = "\w+ \d+ [A-Z][a-z]+ ?(.*)" 
     afterFirstUpperCaseWord = .Replace(strIn, "$1") 
    End With 
End Function 
4

您正在尋找多蓋一個單詞的第一個實例。讓我們構建一個正則表達式,以此作爲第一步。

您正在尋找大寫字母:[A-Z]

他們必須是同一個詞,所以兩個大寫字母之間只能有小寫字母:[a-z]

可以有零個或多個小寫字母2個大寫字母之間:出現這種情況後[A-Z][a-z]*[A-Z]

什麼應該是結果的一部分,所以我們也是在這個字符串的剩餘權益。這可以是零個或多個任何字符的出現:[A-Z][a-z]*[A-Z].*

在這種情況發生之前,我們也可以有零個或多個任何字符的出現。但是,我們希望找到一審,所以我們必須通過附加?它使我們的正則表達式的那部分「非貪婪」:.*?[A-Z][a-z]*[A-Z].*

現在我們已經完成了一個正則表達式查找你正在尋找。


第二步:您想要在找到的模式中將第二個大寫字母開始的單詞分開。所以我們把括號(圓括號中)僅僅是大寫字母前後表達結束後開始:.*?[A-Z][a-z]*([A-Z].*)


第三步:您要檢索您使用在第二步中分離出的字符串的一部分括號。我們通過使用$1,這意味着在正則表達式的第一組括號中的內容:.Replace(inputString, "$1")


如果我們把這個在VBA函數,我們會得到這樣的:

Function SplitMultipleCaps(inputString As String) 
    Dim objRegex As Object 
    Set objRegex = CreateObject("vbscript.regexp") 
    With objRegex 
     .Global = False 
     .Pattern = ".*?[A-Z][a-z]*([A-Z].*)" 
     SplitMultipleCaps = .Replace(inputString, "$1") 
    End With 
End Function 

注:我把.Global = False,因爲你只想做一次。該函數也可以與.Global = True一起使用,但我覺得在這種情況下False更合適。

+0

很好的解釋! – Ohms