VBA正则expression式提取支架之间的文本,没有支架

像这样的句子:

“[x]阿尔法

[33] Beta“

我成功地使用VBA正则expression式来提取括号数据数组([x],[33]):

"(\[x\])|(\[\d*\])" 

但是,即使在使用什么web资源build议模式之后,我也不能直接提取出包含联合括号的数据(x,33)

 "(?<=\[)(.*?)(?=\])" 

这是一个VBA的具体问题(即限制正则expression式的实现)还是我理解错误的“向前和向后”模式? 我的代码是:

 Public Function Regx( _ ByVal SourceString As String, _ ByVal Pattern As String, _ Optional ByVal IgnoreCase As Boolean = True, _ Optional ByVal MultiLine As Boolean = True, _ Optional ByVal MatchGlobal As Boolean = True) _ As Variant Dim oMatch As Match Dim arrMatches Dim lngCount As Long ' Initialize to an empty array arrMatches = Array() With New RegExp .MultiLine = MultiLine .IgnoreCase = IgnoreCase .Global = MatchGlobal .Pattern = Pattern For Each oMatch In .Execute(SourceString) ReDim Preserve arrMatches(lngCount) arrMatches(lngCount) = oMatch.Value lngCount = lngCount + 1 Next End With Sub testabove() Call Regx("[x] Alpha" & Chr(13) & _ "[33] Beta", "(\[x\])|(\[\d*\])") End Sub 

使用捕获周围的子模式,将获取您所需的价值。

使用

 "\[(x)\]|\[(\d*)\]" 

(或者\d+如果您需要匹配至less1个数字,则*表示零次或多次出现+表示一次或多次出现 )。

然后,通过检查子Submatches长度来访问正确的Submatches索引(因为你有一个replace,任何一个子匹配都将是空的),然后你去。 只要改变你for循环

 For Each oMatch In .Execute(SourceString) ReDim Preserve arrMatches(lngCount) If Len(oMatch.SubMatches(0)) > 0 Then arrMatches(lngCount) = oMatch.SubMatches(0) Else arrMatches(lngCount) = oMatch.SubMatches(1) End If ' Debug.Print arrMatches(lngCount) ' - This outputs x and 33 with your data lngCount = lngCount + 1 Next 

使用Excel和VBA,可以提取正则expression式之后去掉括号:

 Sub qwerty() Dim inpt As String, outpt As String Dim MColl As MatchCollection, temp2 As String Dim regex As RegExp, L As Long inpt = "38c6v5hrk[x]537fhvvb" Set regex = New RegExp regex.Pattern = "(\[x\])|(\[\d*\])" Set MColl = regex.Execute(inpt) temp2 = MColl(0).Value L = Len(temp2) - 2 outpt = Mid(temp2, 2, L) MsgBox inpt & vbCrLf & outpt End Sub 

在这里输入图像描述

尝试这个:

 \[(x)\]|\[(\d*)\] 

你不想被捕获的东西,不要放在里面()。 这用于分组

说明

 You will get x and 33 in $1 and $2 

点网样本

好吧,我为你准备好了,尽pipe离vb很远。 很多可能不需要,但它可以帮助你更好地理解它

 Imports System.Text.RegularExpressions Module Example Public Sub Main() Dim text As String = "[x] Alpha [33] Beta]" Dim pattern As String = "\[(x)\]|\[(\d*)\]" ' Instantiate the regular expression object. Dim r As Regex = new Regex(pattern, RegexOptions.IgnoreCase) ' Match the regular expression pattern against a text string. Dim m As Match = r.Match(text) Dim matchcount as Integer = 0 Do While m.Success matchCount += 1 Console.WriteLine("Match" & (matchCount)) Dim i As Integer For i = 1 to 2 Dim g as Group = m.Groups(i) Console.WriteLine("Group" & i & "='" & g.ToString() & "'") Dim cc As CaptureCollection = g.Captures Dim j As Integer For j = 0 to cc.Count - 1 Dim c As Capture = cc(j) Console.WriteLine("Capture" & j & "='" & c.ToString() _ & "', Position=" & c.Index) Next Next m = m.NextMatch() Loop End Sub End Module 

无正则expression式的数组:

 For Each Value In Split(SourceString, Chr(13)) ReDim Preserve arrMatches(lngCount) arrMatches(lngCount) = Split(Split(Value, "]")(0), "[")(1) lngCount = lngCount + 1 Next