2011-09-25 12 views
1

Mon code est:regex (ABV) - répéter un motif

Dim regEx, retVal 
' Create regular expression. 
set text = "update my_table  set time4 = sysdate,  randfield7 = 'FAeKE',  randfield3 = 'MyE',  the_field9 = 'test'  WHERE my_key = '37',    tymy_key = 'me';" 
Set regEx = CreateObject("vbscript.regexp") 
regEx.pattern = ".+where.+ \'(.+)\'+.*;" 
regEx.IgnoreCase = True 
regEx.MultiLine = True 
regEx.Global = True 

Set objRegexMC = regEx.Execute(text) 
MsgBox objRegexMC(0).SubMatches(0) 

je veux qu'il MSGBOX 37 puis me MSGBOX mais il ne me msgboxes.

Répondre

3

Désolé, cette réponse est pour Excel, mais peut-être que ça va vous aider à mettre sur la bonne voie. VBA ne supporte pas lookbehind, mais vu la situation, il y a moyen de le faire (en utilisant une sous-chaîne de l'original).

Voici le code. texte en supposant était dans la cellule A1, voici ce que vous écrivez:

=RegexExtract(RegexExtract(A1,"WHERE(.+)"),"\'(\w+)\'") 

Il produirait le résultat: "37, me"

Function RegexExtract(ByVal text As String, _ 
         ByVal extract_what As String, _ 
         Optional seperator As String = ", ") As String 

Application.ScreenUpdating = False 
Dim i As Long, j As Long 
Dim result As String 
Dim allMatches As Object, RE As Object 
Set RE = CreateObject("vbscript.regexp") 

RE.Pattern = extract_what 
RE.Global = True 
Set allMatches = RE.Execute(text) 

With allMatches 
For i = 0 To .Count - 1 
    For j = 0 To .Item(j).submatches.Count - 1 
     result = result & (seperator & .Item(i).submatches.Item(j)) 
    Next 
Next 
End With 

If Len(result) <> 0 Then 
    result = Right$(result, Len(result) - Len(seperator)) 
End If 

RegexExtract = result 
Application.ScreenUpdating = True 

End Function 
+0

l'expression rationnelle en deux étapes est une bonne solution de contournement. Et j'ai aimé la belle touche de combinaison 'seperator & .Item (i) .submatches.Item (j)' avant d'ajouter 'result' – brettdj

3

Vous devez faire le match non gourmand, comme ceci:

regEx.pattern = "where.+?\'(.+?)\'.+?\'(.+?)\'" 
+0

qui retourne: 37' tymy_key = « me – toop

+0

Oups, a échoué à mon propre conseil. J'ai mis à jour ma réponse. –

+0

maintenant il revient juste: 37. Mais non moi – toop