2017-12-02 260 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