2017-10-15 98 views
2

下面我有一個示例測試用例,我只想抓住星期六值,如果單詞Blah出現在它之前。下面是我得到的,但由於某種原因,我最終得到了「Blah」。任何幫助都會很棒。謝謝!如何爲caputure只匹配部分匹配的字符串?非捕獲組

Sub regex_practice() 
Dim pstring As String 

pstring = "foo" & vbCrLf & "Blah" & vbCrLf & vbCrLf & "Saturday" 
'MsgBox pstring 

Dim regex As Object 
Set regex = CreateObject("VBScript.RegExp") 

With regex 
    .Pattern = "(?:Blah)((.|\n)*)Saturday" 
    .Global = True 'If False, would replace only first 
End With 


Set matches = regex.Execute(pstring) 

回答

2

當然。整個比賽中包含一個非捕捉組。你可能在尋找的是在這裏抓住合適的捕獲組。
變化

With regex 
    .Pattern = "(?:Blah)((.|\n)*)Saturday" 
    .Global = True 'If False, would replace only first 
End With 

With regex 
    .Pattern = "Blah[\s\S]*?(Saturday)" 
    .Global = True 'If False, would replace only first 
End With 

然後使用.SubMatches

If regex.test(pstring) Then 
    Set matches = regEx.Execute(pstring) 
    GetSaturday = matches(0).SubMatches(0) 
End If 

此外((.|\n)*)是相當糟糕,而使用例如[\s\S]*?

+2

'(。| \ n)*'不是*相當*不好,這太可怕了。請不要建議 - 除非它是ElasticSearch。順便說一句,匹配任何字符的原生ES5結構是'[^]',但'[\ s \ S]'沒問題。 –

+0

謝謝!這確實有助於很多。我從這裏得到了(。| \ n)*結構(第二個答案),190個讚揚聲。 https://stackoverflow.com/questions/159118/how-do-i-match-any-character-across-multiple-lines-in-a-regular-expression – user60887

+0

@ user60887:在鏈接的問題是:*使用與JavaScript相同的方法,'([\ s \ S] *)'。*很高興幫助順便說一句。 – Jan