VBA - 正则表达式与变量分割

时间:2017-12-02 23:41:21

标签: regex excel vba

我希望在具有多个上限的单词的第一个实例之后拆分单元格。

示例1:

输入1:第4层InformatiqueNoosavilleSep

所需输出1:NoosavilleSep

模式:拆分应发生在最后一个单词的第二个大写实例中。 " InformatiqueNoosavilleSep"

示例2:

输入:第13层InformatiqueSurfers ParadiseSep

输出:Surfers ParadiseSep

模式:分裂不应该出现在最后一个单词上,而是出现在" InformatiqueSurfers"代替。

问题:找到分割单词的位置的模式因单元格而异。

我们所知道的事情:

1:如果最后一个单词包含三个大写字母,那么我们总是想在这个单词中拆分字符串.Example1

2:如果最后一个单词只包含两个大写字母" ParadiseSep"我们必须在前面的单词上拆分字符串。例2

我发现这段代码允许使用大写锁定来拆分字符串并添加空格。

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时,这个正则表达式已经超出了我的领域。

感谢阅读!

2 个答案:

答案 0 :(得分:3)

您正在寻找具有多个上限的单词的第一个实例。让我们构建一个正则表达式,作为第一步找到它。

您正在寻找大写字母:[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].*) < / p>

现在我们已经完成了一个正则表达式来找到你要找的东西。

第二步:您希望从找到的模式中的第二个大写字母开始分割单词。所以我们把括号(圆括号)放在大写字母之前和表达式结尾之后:$1

第三步:您想要使用括号检索在第二步中隔离的字符串部分。我们使用.Replace(inputString, "$1")来做到这一点,这意味着正则表达式中第一组括号的内容: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

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

.Global = False

注意:我放.Global = True因为你只想做一次。该函数也可以与False一起使用,但我觉得AudioContext在这种情况下更合适。

答案 1 :(得分: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