我希望在具有多个上限的单词的第一个实例之后拆分单元格。
示例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时,这个正则表达式已经超出了我的领域。
感谢阅读!
答案 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