[vb.net] regex vraag

Pagina: 1
Acties:

  • toost
  • Registratie: Januari 2002
  • Laatst online: 30-01-2025
ik heb een willekeurige string die ik door een spellingscontrole wil halen.
Omdit te doen moet ik de string schoonmaken van symbolen en splitten op een spatie.
Hiervoor kan ik regex gebruiken, dit heb ik gedaan in het volgende voorbeeld:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   Function CleanInput(ByVal strIn As String) As String
        Return Regex.Replace(strIn, "[^\w\ ]", "")
    End Function

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim CleanStr = CleanInput(txtVertaal.Text)
        Dim s As String() = Regex.Split(CleanStr, " ")

        Dim counter = 0

        For counter = 0 To s.Length - 1


            'test weergave in listbox
            lsSuggestie.Items.Add(s(counter))
        Next
    End Sub


dit werkt goed enzoals gewilt. Maar nu loop ik tegen het volgende aan.
Ik ben vergeten dat er niet alleen gesplit moet worden op een spatie, maar ook op een "enter(newline)", want anders gaat hij woorden samenvoegen en dat klopt uiteraard niet.

Ik ben geen ster in reguliere expressies, maar ik weet wel dat het newline char \n is.
Maar hoe voeg ik dan toe dat hij in de replace ook de enters overlaat.

als ik het volgende doe:
Return Regex.Replace(strIn, "[^\w\ \n]", "")
(mijn eerste ingeving voor de oplossing)
dan maakt hij ipv het newline teken een " □ "
Hij herkent de newline dus wel maar vervangt hem met " □ "

Hoe kan ik er voor zorgen dat hij de newline met rust laat.
Daarna moet ik uiteraard ook de newline in de regex.split toevoegen maar als ik voor de replace weet hoe het moet dan wil ik uiteraard eerst weer zelf puzzelen voor de regex.split


groeten Toost

edit:
Er zit nog een foutje in, hij haalt ook de symbolen tussen in een woord weg, maar dit wil ik zelf ook eerst proberen op te lossen.

[ Voor 8% gewijzigd door toost op 15-05-2006 11:27 ]

This space for rent. Serious inquiries only please.


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 13:22

crisp

Devver

Pixelated

windows newlines bestaan uit een cariage return en een newline; je stripped de newline en blijft dus met de carriage returns zitten.
Verder denk ik dat je ook rekening zal moeten houden met tabs en linefeeds; je kan dus beter \s gebruiken - die matched elk whitespace karakter ;)

Intentionally left blank


  • toost
  • Registratie: Januari 2002
  • Laatst online: 30-01-2025
aah kijk, daar ga ik eens even naar kijken, \s :P thnx

edit: works like a charm bedankt !

[ Voor 27% gewijzigd door toost op 15-05-2006 11:34 ]

This space for rent. Serious inquiries only please.


  • toost
  • Registratie: Januari 2002
  • Laatst online: 30-01-2025
Als ik dan ga kijken hoe ik de symbolen links en rechts van de string kan verwijderen kan ik me twee oplossingen bedenken:

Als eerste zag ik op msdn dat er ^ en $ kan worden gebruikt voor het aangeven van begin en einde van een string. Maar reguliere expressies zijn voor mij nog complex en heb hier nog niet zo veel kaas van gegeten.

Als tweede zou ik misschien de left() en right() kunnen gebruiken.
Om te beginnen zou ik dan via left() per char gaan kijken of het een "\w" char is. En dan alles tot op het eerste "\w" char verwijderen. Dan verwijder je dus alle symbolen tot je eerste "\w" char.
En dit dan het zelfde voor right()

Maar ik denk dat de laatste oplossing omslachtig is en dan er met regex een veel simpelere oplossing is, iemand een tip voor me?

This space for rent. Serious inquiries only please.


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 13:22

crisp

Devver

Pixelated

Je kan het beste meerdere stappen doen:
1) splitten op whitespace ("\s+")
2) voor elk 'word' non-word characters van het begin afstrippen: (replace "^[^\w]+" naar "")
3) voor elk 'word' non-word characters van het eind afstrippen: (replace "[^\w]+$" naar "")

note: door 2&3 kan het voorkomen dat je lege 'words' overhoud

Intentionally left blank


  • toost
  • Registratie: Januari 2002
  • Laatst online: 30-01-2025
jah aan lege words zat ik ook al te denken, maar ik dacht dat af te vangen met if word.length > 0 oid.
maar bedankt voor de expressies daar ga ik weer mee aan de slag!

edit: werkt goed! thnx

[ Voor 9% gewijzigd door toost op 15-05-2006 14:06 ]

This space for rent. Serious inquiries only please.

Pagina: 1