[VB6]Submatch met VB

Pagina: 1
Acties:

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05-2025
Ik ben nieuw met Regexp, en vooral met regexp icm met VB. Op de site van microsoft lees ik dat dat kan dmv de vbscript scripting.dll.

Alleen in perl kun je gebruik maken van submatches met $1, $2 enz...
nu wil ik dat ook gebruiken met VB. Ik heb op de site van microsoft gezocht. Alleen, daar vind ik alleen maar dingen over VBS, maar die werken niet in VB zelf. Is het mss mogelijk om op een andere manier te doen. Ik heb de volgende dingen al geprobeerd:

code:
1
2
3
4
5
6
7
8
9
Dim re as RegExp
Dim mc as MatchCollection

re.pattern = "\w+(\s{3})\w+"
set mc = re.execute("dkfsjdfkjsk123esdfsdf")

'hier is dus waar het om gaat
mc.submatches(0) 'maar submatches bestaat gewoon niet
mc.$1 'Die $ is geen geldig teken


Weten jullie mss wat ik wel kan gebruiken?

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Wat zegt de documentatie van MatchCollection?
Daar zal vast wel beschreven zijn of en hoe je submatches uit het resultaat kan halen.

Wat dacht je hiervan? Dit is .net documentatie dus je moet zelf maar even uitzoeken hoe dat zich verhoud tot VB6:
Item - Gets an individual member of the collection.
Maar gewoon wat proberen werkt niet he ;)

[ Voor 58% gewijzigd door Infinitive op 09-07-2004 22:25 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05-2025
Die Item property die wist ik ook wel, alleen dat is niet wat ik bedoel, Dat bevat alleen alle dingen die gematched zijn. Maar ik wil juist nog iets hebben wat in 1 match staat.

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Kan je dat dan niet oplossen met de MatchGroups die je via een Match kan verkrijgen bijv. Kijk ook eens naar een CaptureCollection (itt MatchCollection)

Staat in dit stukje voorbeeldcode uit MSDN niet iets wat je kan gebruiken:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Dim text As String = "One car red car blue car"
Dim pat As String = "(\w+)\s+(car)"
' Compile the regular expression.
Dim r As Regex = new Regex(pat, RegexOptions.IgnoreCase)
' Match the regular expression pattern against a text string.
Dim m As Match = r.Match(text)
Dim matchcount as Integer = 0
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 j
   Next i
   m = m.NextMatch()
End While

[ Voor 13% gewijzigd door Infinitive op 09-07-2004 23:20 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05-2025
Ze gebruiken de regex hier heel anders: regex.success, regex.match, die dingen kent hij helemaal niet in vb

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Dit kwam uit de VB.Net documentatie. Ik had verwacht dat dat wel ongeveer gelijk zou zijn aan wat in de oude VB bibliotheken aanwezig is (omdat ze een verdacht grote gelijkenis tonen).

Ik kan je hiermee dus niet verder helpen. Misschien dat de die-hard VB6ers hier iets over kunnen zeggen?

Heb je ergens een stuk documentatie van die bibliotheek? Misschien wordt wat jij wilt wel niet aangeboden.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Kuhlie
  • Registratie: December 2002
  • Niet online
Ik gebruik zelf:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Option Explicit

Public Function ereg(pattern As String, strng As String, Optional regs As Collection) As Boolean
ereg = ereg2(False, pattern, strng, regs)
End Function

Public Function eregi(pattern As String, strng As String, Optional regs As Collection) As Boolean
eregi = ereg2(True, pattern, strng, regs)
End Function

Private Function ereg2(caseInSensitive As Boolean, pattern As String, strng As String, Optional regs As Collection) As Boolean
Dim r As New RegExp
Dim mc As MatchCollection
Dim m As Match
Dim sm As SubMatches

r.pattern = pattern
r.Global = False
r.IgnoreCase = caseInSensitive
Set mc = r.Execute(strng)

If mc.count = 1 Then
  ereg2 = True
  Set regs = New Collection
  Set m = mc.item(0)
  Set sm = m.SubMatches
  Dim i As Integer
  For i = 0 To sm.count - 1
    regs.Add sm(i)
  Next i
End If
End Function


Je kunt (dacht ik) alleen de totale matchende string niet krijgen (behalve als je natuurlijk je hele regexp van haakjes voorziet, ipv: "^bla(.*)" dus "(^bla(.*))", denk ik :) ).

Edit: dat kon dus wel, alleen gebruiken deze functies dat niet. Als je de totale match nog wilt krijgen moet je iets als totalMatch = m.Value doen.

[ Voor 8% gewijzigd door Kuhlie op 10-07-2004 22:48 . Reden: verbetering ]

Pagina: 1