VBA – 正则expression式与variables分离

我正在寻找一个多个大写字母的第一个实例后拆分单元格。

例1:

input1: 4楼InformatiqueNoosavilleSep

期望的输出1:NoosavilleSep

模式:拆分应该发生在最后一个字的大写字母的第二个实例。 “InformatiqueNoosavilleSep”

例2:

input:地板13 InformatiqueSurfers ParadiseSep

输出: Surfers ParadiseSep

模式:拆分不应该发生在最后一个字,而是在“InformatiqueSurfers”。

问题:find在哪里拆分单词的模式不同于单元格到另一个单元格。

我们知道:

1:如果最后一个单词包含三个大写字母,它总是在这个单词,我们要拆分string。例子1

2:如果最后一个单词只包含两个大写字母“ParadiseSep”,我们必须将string拆分为之前的单词。 例题

我发现这个代码允许拆分string与大写locking并添加空格。

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

正如我正在试图学习VBA这正则expression式越来越远离我的境界。

谢谢阅读!

您正在寻找多个大写字母的第一个实例。 让我们build立一个正则expression式来作为第一步。

你正在寻找大写字母: [AZ]

他们必须在同一个字,所以在两个大写字母之间,你只能有小写字母: [az]

在两个大写字母之间可以有零个或多个小写字母: [AZ][az]*[AZ]

这个事件之后的任何事情都应该是结果的一部分,所以我们也对这个string的其余部分感兴趣。 这可以是零或更多的任何字符出现: [AZ][az]*[AZ].*

在此之前,我们也可以有零个或更多的任何字符出现。 但是我们想要find第一个例子 ,所以我们必须通过附加一个“非贪婪” 对它: .*?[AZ][az]*[AZ].*

现在我们已经完成了一个正则expression式来find你正在寻找的东西。


第二步:您想要在find的模式中从第二个大写字母开始分割单词。 所以我们在大写字母之前和expression式结尾之后加上括号(圆括号): .*?[AZ][az]*([AZ].*)


第三步:您要使用圆括号检索第二步中分离的string部分。 我们使用$1 ,这意味着正则expression式中第一组括号的内容: .Replace(inputString, "$1")


如果我们把它放在一个vba函数中,我们会得到如下的东西:

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

注:我把.Global = False因为你只想做一次。 这个函数也可以用.Global = True ,但是我觉得在这种情况下False更合适。

尝试这个:

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