Toon posts:

[vb.net]Replace, maar niet als het tussen quotes staat

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een functie die alle tekens "a" veranderd in "b", tenzij b ingeloten is door "c".
(Doel: SQL query omschrijven, maar de delen tussen quotes met rust laten)

Nu heb ik dit als code:
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Protected Function SafeReplace(ByVal Query As String, ByVal OldChar As String, ByVal NewChar As String, ByVal safe As Char) As String
        Dim OldCharPos As Integer

        ' We want to avoid doing any work, of course ;)
        If IsDBNull(Query) Then Return Nothing

        ' If the query has no length, there is no need to do anything
        If Query.Length = 0 Then Return Query

        ' If OldChar=NewChar , there is no need to do anything
        If OldChar = NewChar Then Return Query

        ' If the OldChar is not found, there is no need to do anything
        If InStr(Query, OldChar) = 0 Then Return Query

        ' If the 'safe' is not found, all can be safely translated
        If InStr(Query, safe) = 0 Then Return Query.Replace(OldChar, NewChar)

        '''''''''''''''''''''''''''''''''''''''''''''
        ' Need this function to do some stuff recursive. Now ONLY analyses first 

        ' Locate the position of the first oldchar
        Dim before As String
        Dim selected As String
        Dim after As String

        OldCharPos = InStr(Query, OldChar)
        ' It seems we do have to work on this one.
        Dim teller As Integer = 0
        For pos As Integer = 0 To OldCharPos
            If Query.Chars(pos) = safe Then
                teller += 1
            End If
        Next

        before = Left(Query, OldCharPos - 1)
        after = Right(Query, Query.Length - OldCharPos)
        If ((teller Mod 2) = 0) Then
            selected = NewChar
        Else
            selected = OldChar
        End If

        Return before & selected & after
    End Function

Deze code werkt goed, maar bekijkt alleen de eerste set quotes.
Ik zie alleen niet waar en hoe ik iets moet doen om dit aan te passen, want als ik teksten aanpas, veranderd natuurlijk de positie, en als ik helemaal vooraan begin, dan blijft hij continu dezelfde 'set' aanpassen...
Ik gok iets van recursief, maar zie niet precies hoe en waar...... 8)7

[ Voor 10% gewijzigd door Verwijderd op 30-06-2005 17:51 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Kan je dit niet makkeljiker oplossen met een Regular Expression?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Ongetwijfeld, maar reguliere expressies zijn voor mij nog altijd abracadabra ;)

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dan zou ik er eens een aantal tutorials over lezen. Volgens mij staan er in de P&W faq wel wat linkjes naar. Je kan het ook bijvoorbeeld ongeveer als volgt doen

C#:
1
2
3
4
5
6
7
8
9
10
string MyString;
int curIndex = 0;
while( (curIndex = MyString.IndexOf( 'a', curIndex )) >= 0 )
{
    if( MyString[ curIndex -1 ] == '"' && MyString[ curIndex + 1 ] == '"' )
        //Geen replace
    else
        //Wel replace
    ++curIndex; // Zorg dat de indexof niet nog een keer hetzelfde char vind
}

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Ik weet van te voren niet hoelang de tekst tussen de quotes is, dus op pos-1 en pos+1 zoeken gaat niet werken, ben ik bang.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
voordat je gaat replacen weet je toch wel hoe lang de string is die je zoekt lijkt me?

Dan kan je gewoon MyString[ curIndex - 1 ] en MyString[ curIndex + FindString.Length + 1 ] doen. Het princiepe blijft hetzelfde.

Maar wat wil je er eigenlijk mee doen? Ik zie nou pas dat je een query erin stopt. Is dit om characters te escapen voor sql queries?

Als dat zo is kan je betere eens naar Parameterised Queries kijken. Dan heb je helemaal geen last meer van escapen.

[ Voor 38% gewijzigd door Woy op 01-07-2005 11:39 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
rwb schreef op vrijdag 01 juli 2005 @ 09:16:
Dan zou ik er eens een aantal tutorials over lezen. Volgens mij staan er in de P&W faq wel wat linkjes naar. Je kan het ook bijvoorbeeld ongeveer als volgt doen

C#:
1
2
3
4
5
6
7
8
9
10
string MyString;
int curIndex = 0;
while( (curIndex = MyString.IndexOf( 'a', curIndex )) >= 0 )
{
    if( MyString[ curIndex -1 ] == '"' && MyString[ curIndex + 1 ] == '"' )
        //Geen replace
    else
        //Wel replace
    ++curIndex; // Zorg dat de indexof niet nog een keer hetzelfde char vind
}
Wel eens gehoord van een conditie inverteren?
C#:
1
2
if (MyString[curIndex -1] != '"' || MyString[curIndex +1] != '"')
   ++curIndex

Heb verder niet gekeken naar wát je precies doet, alleen hóe je het doet ;)

edit:
Sjonge, ik blijf maar bezig met de hele tijd verkeerde dingetjes te verbeteren, zoals '"" ipv "'"...

[ Voor 50% gewijzigd door riezebosch op 01-07-2005 11:52 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1