VBA使用正则表达式拆分字符串

时间:2017-08-01 19:50:11

标签: regex vba split delimiter

希望有人能够为我正在做的事情提供更好的方法。不幸的是,数据和代码位于客户端系统上,因此我无法共享它们。

我有一个以前是数据表的长字符串,需要再次将值拆分为行和列。系统被严重锁定,所以我只能使用VBA。我能想到的最好方法是使用正则表达式来标识列和行。我已经设置了我的正则表达式对象并针对输入字符串执行,具有我需要的所有匹配,这很好。问题是,如果我做

re = CreateObject("VBScript.RegExp")
re.pattern = mypattern
re.split(myString)

据我所知,没有办法保留我分裂的价值观。在某些情况下,我想在正则表达式字符串的中间分割。

我认为最有希望的解决方案是

re = CreateObject("VBScript.RegExp")
re.pattern = mypattern
Set matches = re.execute(myString)
for each match in matches:
    'do something with match.firstindex

我考虑过插入分隔符,然后使用split。不幸的是,VBA似乎没有方法将字符插入字符串中,使用firstindex看起来有点笨拙。

有没有人对更好的方法有任何想法?如果是这样,我们非常感激。

1 个答案:

答案 0 :(得分:1)

您实际上可以在字符串中插入字符。取决于你对“笨重”的定义,但这是一个例子:

ActiveCell.Characters(5, 1).Insert (" | ")

这将从单元格的第五个字符开始“|”。您可能需要使用查找或通过单元格字符的某些循环来识别某些位置,但我认为这可能会让您继续前进。

使用STRING EDIT更新 这只是我的偏好,但编辑字符串似乎并不太笨重。您可以使用此设置来获得您想要的内容:

Sub StringSlicerSample()
Dim teststring As String, Separater As String, tangoTxt As String, BeforeTXT As String, AfterTxt As String, MidTxt As String
Dim Position_To_Slice As Integer

teststring = "xxxbangyyy"    
Separater = " | " 'can be whatever you want as separator    
tangoTxt = "bang" 'text to look for that you want use for split
Position_To_Slice = 1 'If you want to split somewhere in between, lets say after the "b"
'put =1 as that's the first position in "bang"

'Insert separator before
BeforeTXT = Mid(teststring, 1, InStr(1, teststring, tangoTxt) - 1) & Separater & Mid(teststring, InStr(1, teststring, tangoTxt), Len(teststring))

'Insert after
AfterTxt = Mid(teststring, 1, InStr(1, teststring, tangoTxt) + Len(tangoTxt) - 1) & Separater & Mid(teststring, InStr(1, teststring, tangoTxt) + Len(tangoTxt), Len(teststring))

'Split inbetween based on position to slice
MidTxt = Mid(teststring, 1, InStr(1, teststring, tangoTxt) + Position_To_Slice - 1) & Separater & Mid(teststring, InStr(1, teststring, tangoTxt) + Position_To_Slice, Len(teststring))


MsgBox BeforeTXT, Title:="Before Example"
MsgBox AfterTxt, Title:="After Example"
MsgBox MidTxt, Title:="Sliced in position " & Position_To_Slice

End Sub