login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Recursive Regex (Opgelost)

Offline Ontani - 19/10/2009 20:15 (laatste wijziging 20/10/2009 11:34)
Avatar van OntaniGouden medailleGouden medailleGouden medailleGouden medaille

-1
Ik zit met een dynamische query waar in runtime filter velden aan toegevoegd moeten worden. Daarom probeer ik in deze query de select statement en de where statement te onderscheiden.

Omdat er verschillende subqueries in kunnen zitten had ik gehoopt met REGEX hier wat verschil te kunnen maken.

Je kan bijvoorbeeld niet gewoon zoeken naar de laatste where omdat er binnen een where ook nog subqueries kunnen zijn met (select * from blaat where foo = bar) hetzelfde geld voor de eerste where want deze kan komen uit een subquery in de select.

Om die reden wou ik naar regex stappen maar krijg het niet voor elkaar.

Bijvoorbeeld:
  1. Query:
  2. select A, (select B from C where D = F) from G where H exists (select I from J where K = L) and M = N order by O,P Desc
  3.  
  4. Regex:
  5. select (.*) from (.*) where (.*)
  6.  
  7. Result:
  8. * A, (select B from C where D = F) from G where H exists (select I
  9. * J
  10. * K = L) and M = N order by O,P Desc


Maar het resultaat dat ik wil is:
  1. Result:
  2. * A, (select B from C where D = F)
  3. * G
  4. * H exists (select I From J where K = L) and M = N order by O,P Desc


Dit lijkt met alleen met een recursive regex te doen. Maar weet niet hoe. Probeer nu niet een regex te maken die werkt voor de regel die ik als voorbeeld geef wat dit kan evenzeer met 5 subqueries en 3 subsubqueries binnen een andere subquery zijn.

De query is dynamisch.

Iemand een idee voor een oplossing? JeXuS  ?


Probleem opgelost:
Zonder regex omdat het blijkbaar niet mogelijk is dit binnen 1 reguliere expressie te schrijven.

Ik heb het nu opgelost door mijn eigen functie te schrijven binnen .NET:

  1. Private Function ParseQuery(ByVal query As String, ByVal filters As String) As String
  2. Dim orgiQuery As String = query
  3.  
  4. query = orgiQuery.ToLower
  5.  
  6. Dim openQuotes As New ArrayList()
  7. Dim closeQuotes As New ArrayList()
  8.  
  9. Dim whereIndex As Integer = -1
  10. Dim orderIndex As Integer = -1
  11. Dim groupIndex As Integer = -1
  12. Dim startIndex As Integer = 0
  13.  
  14. While query.IndexOf("(", startIndex) > -1
  15. startIndex = query.IndexOf("(", startIndex) + 1
  16. openQuotes.Add(startIndex)
  17. End While
  18.  
  19. startIndex = 0
  20. While query.IndexOf(")", startIndex) > -1
  21. startIndex = query.IndexOf(")", startIndex) + 1
  22. closeQuotes.Add(startIndex)
  23. End While
  24.  
  25. startIndex = 0
  26. While query.IndexOf("where", startIndex) > -1
  27. startIndex = query.IndexOf("where", startIndex) + 1
  28.  
  29. Dim blnFound As Boolean = True
  30. For i As Integer = 0 To openQuotes.Count - 1
  31. If CInt(openQuotes(i)) < startIndex And CInt(closeQuotes(i)) > startIndex Then
  32. blnFound = False
  33. Exit For
  34. End If
  35. Next
  36.  
  37. If blnFound Then
  38. whereIndex = startIndex
  39. End If
  40.  
  41. End While
  42.  
  43. If whereIndex = -1 Then
  44. startIndex = 0
  45. While query.IndexOf("order by", startIndex) > -1
  46. startIndex = query.IndexOf("order by", startIndex) + 1
  47.  
  48. Dim blnFound As Boolean = True
  49. For i As Integer = 0 To openQuotes.Count - 1
  50. If CInt(openQuotes(i)) < startIndex And CInt(closeQuotes(i)) > startIndex Then
  51. blnFound = False
  52. Exit For
  53. End If
  54. Next
  55.  
  56. If blnFound Then
  57. orderIndex = startIndex
  58. End If
  59.  
  60. End While
  61.  
  62. startIndex = 0
  63. While query.IndexOf("group by", startIndex) > -1
  64. startIndex = query.IndexOf("group by", startIndex) + 1
  65.  
  66. Dim blnFound As Boolean = True
  67. For i As Integer = 0 To openQuotes.Count - 1
  68. If CInt(openQuotes(i)) < startIndex And CInt(closeQuotes(i)) > startIndex Then
  69. blnFound = False
  70. Exit For
  71. End If
  72. Next
  73.  
  74. If blnFound Then
  75. groupIndex = startIndex
  76. End If
  77.  
  78. End While
  79.  
  80. End If
  81.  
  82. If groupIndex > -1 Then
  83. orgiQuery = orgiQuery.Insert(groupIndex - 1, " where " & filters)
  84. ElseIf orderIndex > -1 Then
  85. orgiQuery = orgiQuery.Insert(orderIndex - 1, " where " & filters)
  86. ElseIf whereIndex > -1 Then
  87. orgiQuery = orgiQuery.Insert(whereIndex + 4, " " & filters & " and ")
  88. Else
  89. orgiQuery &= " where blaat = blaat"
  90. End If
  91.  
  92. Return orgiQuery
  93.  
  94. End Function

0 antwoorden

Gesponsorde links
Er zijn nog geen reacties op dit bericht.
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.191s