【问题标题】:VBA - Regex Split with variableVBA - 带有变量的正则表达式拆分
【发布时间】:2017-12-03 18:06:32
【问题描述】:

我希望在具有多个大写字母的单词的第一个实例之后拆分一个单元格。

示例 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 时,这个正则表达式有点超出我的领域。

感谢阅读!

【问题讨论】:

  • 这似乎更像是一个解析问题而不是正则表达式问题,尽管我不是专家。换句话说:从头开始,找到“单词”。如果它有三个上限,则在那里拆分。否则找到倒数第二个单词并在那里拆分。
  • 可能是这样的regex101.com/r/aW2enR/3。查看您最初的问题,当您遇到不同的边缘情况时,似乎要求可能会不断变化
  • 是另一种定义它的方式,新值只是“Informatique”之后的单元格值的一部分?
  • 所以在你给定的例子2中,输出是正确的(你想要的)还是不正确的?如果不正确,您能否告诉我们您想要的输出(例如 2)是什么?
  • 感谢 Slai 对彼得的精彩解释和你的想法,我学到了很多,

标签: regex excel vba


【解决方案1】:

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

您正在寻找大写字母:[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 在这种情况下更合适。

【讨论】:

  • 很好的解释!
【解决方案2】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多