使用RegExp

时间:2015-09-15 12:25:52

标签: regex excel vba excel-vba

编辑:哇,感谢您提出这么多建议,但我希望有一个专门针对未来,更复杂使用的正则表达式解决方案。

我需要支持在VBA Excel中拆分文本字符串。我环顾四周,但解决方案要么是针对其他语言,要么是我无法在VBA中使用。

我想只用单斜线拆分单词:

text1/text2- split
text1//text2- no split
text1/text2//text3 - split after text1

我尝试使用regexp.split函数,但不认为它在VBA中有效。谈到模式,我在思考如下:

(?i)(?:(?<!\/)\/(?!\/))

但在我的宏中执行搜索时我也会遇到错误,因为它适用于以下网站:https://www.myregextester.com/index.php#sourcetab

4 个答案:

答案 0 :(得分:3)

您可以使用RegExp匹配方法而不是拆分方法。您需要匹配/或双//以外的任何字符才能获取所需的值。

这是一个&#34;包裹&#34; (即交替)版本的正则表达式:

(?:[^/]|//)+

这是demo

这里效率更高,但可读性更低:

[^/]+(?://[^/]*)*

请参阅another demo

这是一个有效的VBA代码:

Sub GetMatches(ByRef str As String, ByRef coll As collection)

Dim rExp As Object, rMatch As Object

Set rExp = CreateObject("vbscript.regexp")
With rExp
    .Global = True
    .pattern = "(?:[^/]|//)+"
End With

Set rMatch = rExp.Execute(str)
If rMatch.Count > 0 Then
    For Each r_item In rMatch
        coll.Add r_item.Value
        Debug.Print r_item.Value
    Next r_item
End If
Debug.Print ""
End Sub

按如下方式调用sub:

Dim matches As New collection
Set matches = New collection
GetMatches str:="text1/text2", coll:=matches

以下是3个字符串的结果:

1. text1/text2
 text1
 text2

2. text1/text2//text3
 text1
 text2//text3

3. text1//text2
 text1//text2

答案 1 :(得分:1)

Public Sub customSplit()
    Dim v As Variant

    v = Split("text1/text2//text3", "/")
    v = Replace(Join(v, ","), ",,", "//")

    Debug.Print v   '-> "text1,text2//text3"
End Sub

Replace(Replace("text1/text2//text3", "/", ","), ",,", "//")   '-> "text1,text2//text3"

答案 2 :(得分:0)

转到“数据”选项卡,然后转到“文本到列”选项。稍后,选择“Delimited”选项,然后选择“other”并输入您想要的任何分隔符。

答案 3 :(得分:0)

文本到列将起作用。如果要保留原始值,另一个选项是使用公式: 在B1

=left(a1,find(":",a1)-1) 
C1中的

=mid(a1,find(":",a1)+1,len(a1))