Regex VBA-带变量的正则表达式拆分

Regex VBA-带变量的正则表达式拆分,regex,excel,vba,Regex,Excel,Vba,我希望在一个单词出现多个大写后拆分一个单元格 示例1: 输入1:第四层信息 期望输出1:NoosavilleSep 模式:拆分应发生在最后一个单词的第二个大写字母处。“InformatiqueNoosavilleSep” 示例2: 输入:第13层信息冲浪者乐园 输出:冲浪者 模式:拆分不应出现在最后一个单词,而应出现在“InformatiqueSurfer”上 问题是:从一个单元格到另一个单元格,查找单词拆分位置的模式不同 我们所知道的: 1:如果最后一个单词包含三个大写字母,我们总是在这个单词

我希望在一个单词出现多个大写后拆分一个单元格

示例1:

输入1:第四层信息

期望输出1:NoosavilleSep

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

示例2:

输入:第13层信息冲浪者乐园

输出:冲浪者

模式:拆分不应出现在最后一个单词,而应出现在“InformatiqueSurfer”上

问题是:从一个单元格到另一个单元格,查找单词拆分位置的模式不同

我们所知道的:

1:如果最后一个单词包含三个大写字母,我们总是在这个单词处拆分字符串。示例1

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时,这个正则表达式有点超出了我的范围

谢谢你的阅读

试试这个:

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

您正在查找具有多个大写字母的单词的第一个实例。首先,让我们构建一个正则表达式来找到它

您正在查找大写字母:
[A-Z]

它们必须在同一个单词中,因此在两个大写字母之间只能有小写字母:
[a-z]

两个大写字母之间可以有零个或多个小写字母:
[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
在这种情况下更合适。

这似乎更像是一个解析问题,而不是正则表达式问题,尽管我不是专家。换句话说:从结尾开始,找到“单词”。如果它有三个盖子,那么在那里分开。或者找到下一个最后一个单词,然后在那里分开。也许是这样的。从您最初的问题来看,当您遇到不同的边缘情况时,需求可能会不断变化。这是定义新值只是“Informatique”之后单元格值的一部分的另一种方式?因此,在给定的示例2中,输出是正确的(您想要的)还是不正确的?如果它不正确,你能告诉我们你想要的输出是什么吗,例如2?感谢Slai对Peter的精彩解释和你的想法,我学到了很多,精彩的解释!