none
[VB 2010] eliminare parte di una stringa

    Domanda

  • ciao a tutti come da titolo vorrei eliminare parte di una stringa..mi spiego subito...

    Ho delle stringhe tipo: R001(1), R004(9),J003(14), QTPFIT(9)

    io vorrei arrivare ad avere solo e sempre il nome togliendo "()" e numero all'interno di esse. come posso fare?

    vi ringrazio anticipatamente

    giovedì 23 febbraio 2012 08:57

Risposte

  • Proviamo ad analizzare punto per punto le singole componenti dell'espressione:

    Dim pattern As String = "\(([^)]*)\)"
    

    • \( = indica che il pattern da ricercare deve cominciare con una parentesi (poiché la parentesi è una carattere speciale per le Regular Expression, bisogna farlo precedere dal simbolo \).
    • [^)]* = indica che, dopo la parentesi, può esserci una sequenza, eventualmente vuota, di qualsiasi carattere che non sia la parentesi chiusa: il "qualsiasi carattere che non sia la parentesi chiusa" si esprime con ^), dove ^ indica la negazione dell'espressione successiva (in pratica è come se si leggesse "non parentesi chiusa). L'asterisco, invece, specifica che la sequenza può contenere un numero qualsiasi di elementi (ovvero di caratteri).
    • \) = indica che il pattern deve terminare con una parantesi chiusa.

    Spero di averti chiarito un po' le idee. La sintassi delle Regular Expression non è molto intuitiva, quindi è necessario prenderci un po' di dimestichezza. Se vuoi approfondire l'argomento, ti consiglio di leggere questo tutorial: http://www.regular-expressions.info/quickstart.html.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    giovedì 23 febbraio 2012 10:12
  • Puoi usare una Regular Expression che elimini le parentesi e tutto quanto è contento in esse:

     Dim msg As String = "R001(1), R004(9),J003(14), QTPFIT(9)"
     Dim pattern As String = "\(([^)]*)\)"
     Dim expr As New System.Text.RegularExpressions.Regex(pattern)
    
     Dim ret As String = expr.Replace(msg, String.Empty)


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    giovedì 23 febbraio 2012 09:34

Tutte le risposte

  • Ciao,

    potresti usare la funzione Mid, leggi pure dalla guida ufficiale:

    http://msdn.microsoft.com/it-it/library/05e63829(v=vs.80).aspx

    fammi sapere

    Ruggiero Lovreglio 
    www.ruggierolovreglio.altervista.org


    giovedì 23 febbraio 2012 09:02
  • Puoi usare una Regular Expression che elimini le parentesi e tutto quanto è contento in esse:

     Dim msg As String = "R001(1), R004(9),J003(14), QTPFIT(9)"
     Dim pattern As String = "\(([^)]*)\)"
     Dim expr As New System.Text.RegularExpressions.Regex(pattern)
    
     Dim ret As String = expr.Replace(msg, String.Empty)


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    giovedì 23 febbraio 2012 09:34
  • Ciao Marco,

    mi spiegheresti la logica di quello che hai scritto in "pattern"?

    Grazie in anticipo 

    Ruggiero Lovreglio 
    www.ruggierolovreglio.altervista.org


    giovedì 23 febbraio 2012 10:01
  • Proviamo ad analizzare punto per punto le singole componenti dell'espressione:

    Dim pattern As String = "\(([^)]*)\)"
    

    • \( = indica che il pattern da ricercare deve cominciare con una parentesi (poiché la parentesi è una carattere speciale per le Regular Expression, bisogna farlo precedere dal simbolo \).
    • [^)]* = indica che, dopo la parentesi, può esserci una sequenza, eventualmente vuota, di qualsiasi carattere che non sia la parentesi chiusa: il "qualsiasi carattere che non sia la parentesi chiusa" si esprime con ^), dove ^ indica la negazione dell'espressione successiva (in pratica è come se si leggesse "non parentesi chiusa). L'asterisco, invece, specifica che la sequenza può contenere un numero qualsiasi di elementi (ovvero di caratteri).
    • \) = indica che il pattern deve terminare con una parantesi chiusa.

    Spero di averti chiarito un po' le idee. La sintassi delle Regular Expression non è molto intuitiva, quindi è necessario prenderci un po' di dimestichezza. Se vuoi approfondire l'argomento, ti consiglio di leggere questo tutorial: http://www.regular-expressions.info/quickstart.html.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    giovedì 23 febbraio 2012 10:12
  • Grazie mille per l'esaustiva risposta.

    A presto

    Ruggiero Lovreglio 
    www.ruggierolovreglio.altervista.org


    giovedì 23 febbraio 2012 10:19
  • Di niente, è sempre un piacere.

    Buona giornata.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    giovedì 23 febbraio 2012 10:20
  • Proviamo ad analizzare punto per punto le singole componenti dell'espressione:

    Dim pattern As String = "\(([^)]*)\)"

    • \( = indica che il pattern da ricercare deve cominciare con una parentesi (poiché la parentesi è una carattere speciale per le Regular Expression, bisogna farlo precedere dal simbolo \).
    • [^)]* = indica che, dopo la parentesi, può esserci una sequenza, eventualmente vuota, di qualsiasi carattere che non sia la parentesi chiusa: il "qualsiasi carattere che non sia la parentesi chiusa" si esprime con ^), dove ^ indica la negazione dell'espressione successiva (in pratica è come se si leggesse "non parentesi chiusa). L'asterisco, invece, specifica che la sequenza può contenere un numero qualsiasi di elementi (ovvero di caratteri).
    • \) = indica che il pattern deve terminare con una parantesi chiusa.

    Spero di averti chiarito un po' le idee. La sintassi delle Regular Expression non è molto intuitiva, quindi è necessario prenderci un po' di dimestichezza. Se vuoi approfondire l'argomento, ti consiglio di leggere questo tutorial: http://www.regular-expressions.info/quickstart.html.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    grazie 1000 era proprio quello che cercavo! sei sempre d'aiuto!
    giovedì 23 febbraio 2012 10:27
  • E io sono sempre felice di poter dare una mano :-)

    Alla prossima.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    giovedì 23 febbraio 2012 10:28
  • E io sono sempre felice di poter dare una mano :-)

    Alla prossima.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    Ciao Marco! intanto, ti ringrazio ancora per l'aiuto che riesci a darmi comunque ho avuto un piccolo cambiamento sui dati...Ora sono venuto a sapere che potrei avere la stringa tipo R001(10) come R001-10. quindi dovrei usare lo stesso metodo che mi avevi consigliato sopra per entrambe le possibilità, è possibile??

    Dim pattern As String = "\(([^)]*)\)"

    io penso che il risulta potrebbe essere una cosa del genere? Vorrei una conferma da te perchè vorrei imparare bene ad imparare questo metodo che è molto utile...

    Dim pattern As String ="\(([^]*\) OR \-[^)]*"

    Posso in questo caso usare l'operatore logico OR?? se no, in che altro modo si potrebbe fare?

    ti ringrazio in anticipo

    • Modificato X-SL4UGHT3R venerdì 24 febbraio 2012 08:14
    venerdì 24 febbraio 2012 07:20
  • No, l'operatore OR non esiste nelle Regular Expression. Per identificare un'alternativa tra due o più possibilità, devi usare l'operatore | (pipe).

    Per identificare il nuovo pattern, puoi usare l'espressione -[\d]*, che significa "trattino seguito da una sequenza qualsiasi di numeri. Usando il pipe come detto, l'espressione che identifica entrambi i pattern diventa la seguente:

    Dim pattern As String = "(\([^)]*\)|-[\d]*)"


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    venerdì 24 febbraio 2012 09:01
  • No, l'operatore OR non esiste nelle Regular Expression. Per identificare un'alternativa tra due o più possibilità, devi usare l'operatore | (pipe).

    Per identificare il nuovo pattern, puoi usare l'espressione -[\d]*, che significa "trattino seguito da una sequenza qualsiasi di numeri. Usando il pipe come detto, l'espressione che identifica entrambi i pattern diventa la seguente:

    Dim pattern As String = "(\([^)]*\)|-[\d]*)"


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    grazie per la dritta!
    venerdì 24 febbraio 2012 10:00
  • Sempre a disposizione :-)

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    venerdì 24 febbraio 2012 10:08
  • ciao a tutti!

    l'ultima volta che parlavamo di questo argomento eravamo arrivati alla soluzione

    Private mPattern As String = "(\([^)]*\)|-[\d]*)"

    per i casi Tipo C001(2) oppure C001-2

    ora però ho anche questa variante: C01-S-2 e devo aver come risultato sempre la solita parte --> C01

    Scritta così di seguito funziona però mi mette uno spazio alla fine come posso fare perchè non mi metta lo spazio?

    Private mPattern As String = "(\([^)]*\)|-[^ ]*)"

    perchè in questo modo devo mettere sempre il .trim (Non mi piace :P)...

    chi mi può aiutare?

    vi ringrazio in anticipo...

    mercoledì 28 marzo 2012 07:21
  • Ho provato l'espressione regolare che hai riportato con l'input C01-S-2, ma non nell'output non ci sono spazi finali.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    mercoledì 28 marzo 2012 07:51
  • Ho provato l'espressione regolare che hai riportato con l'input C01-S-2, ma non nell'output non ci sono spazi finali.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    scusa sono stato pirla io!:P avevo caricato una lista sbagliata quindi ovviamente non me ne riconosceva neanche uno!:P
    mercoledì 28 marzo 2012 08:37
  • Grazie mille Marco

    Be a good forum member. Make this forum a great place to meet and interact with others around the world.
    Helpful Links:

    mercoledì 28 marzo 2012 13:37
  • Ancora una volta, in qualità di moderatore (scusate se sono petulante), vi invito a non scrivere post "grazie, prego, scusi, non c'è di che" che allungano il thread inutilmente e non danno allo stesso nulla in più rispetto a quanto già scritto.

    Chi risponde ai forum lo fa perchè animato da passione (almeno si spera) e non ha la necessità di un intero post per un grazie.

    Vi ringrazio dell'attenzione.

    mercoledì 28 marzo 2012 18:30
    Moderatore
    • [^)]* = indica che, dopo la parentesi, può esserci una sequenza, eventualmente vuota, di qualsiasi carattere che non sia la parentesi chiusa: il "qualsiasi carattere che non sia la parentesi chiusa" si esprime con ^), dove ^ indica la negazione dell'espressione successiva (in pratica è come se si leggesse "non parentesi chiusa). L'asterisco, invece, specifica che la sequenza può contenere un numero qualsiasi di elementi (ovvero di caratteri).

    ciao,

    se io volessi dire qualsiasi cosa (anche uno spazio) è giusto dire [ ]?

    giovedì 19 aprile 2012 12:19
  • No, devi usare il carattere speciale che indica "qualsiasi cosa".

    Ti consiglio di dare un'occhiata a questo link: http://www.regular-expressions.info/reference.html. Si tratta di una breve reference sulle Regular Expression, con l'indicazione dei caratteri speciali e del loro significato.

    Segnati anche questo: http://www.regexlib.com/. E' un grandissimo archivio di expressioni regolari, che puoi studiare per capire come funzionano.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    giovedì 19 aprile 2012 12:46
  • No, devi usare il carattere speciale che indica "qualsiasi cosa".

    Ti consiglio di dare un'occhiata a questo link: http://www.regular-expressions.info/reference.html. Si tratta di una breve reference sulle Regular Expression, con l'indicazione dei caratteri speciali e del loro significato.

    Segnati anche questo: http://www.regexlib.com/. E' un grandissimo archivio di expressioni regolari, che puoi studiare per capire come funzionano.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    il punto è questo: ho bisogno di generare in runtime una espressione regolare a seconda dell'utente. Data un textbox l'utente dovrà scrive una cosa del genere : -*;~*;(*;(*);(*2*) dove ";" è il separatore degli OR. è possibile secondo te farlo? esiste gia una dll che lo fa?oppure dovrei a vedere tutte le possibili opzioni e quindi suicidarmi?:P

    venerdì 20 aprile 2012 08:34
  • Non credo che esista una libreria in grado di effettuare il parsing di stringhe e trasformarle in Regular Expression. Anche perché non è assolutamente banale definire un parsing "universale" in grado di trasformare stringhe in un certo formato (come quello del tuo esempio) in espressioni regolari valide.

    Se invece avessi un serie limitata di alternativa, allora la cosa è più semplice, perché potresti seguire un approccio simile a quello suggerito qui: http://stackoverflow.com/questions/6349161/how-to-generate-a-regular-expression-at-runtime-to-match-a-numeric-range.

    Da quello che dici, però, mi sembra di capire che l'utente debba avere libertà massima, e quindi questa strada non è percorribile.

    In alternativa, puoi pensare ad una sorta di wizard in cui permetti all'utente di scegliere tra un numero limitato di opzioni e, sulla base di esse, costruisci l'espressione regolare. Naturalmente è solo un'idea, non so se è appblicabile al tuo contesto.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    venerdì 20 aprile 2012 08:44
  • Non credo che esista una libreria in grado di effettuare il parsing di stringhe e trasformarle in Regular Expression. Anche perché non è assolutamente banale definire un parsing "universale" in grado di trasformare stringhe in un certo formato (come quello del tuo esempio) in espressioni regolari valide.

    Se invece avessi un serie limitata di alternativa, allora la cosa è più semplice, perché potresti seguire un approccio simile a quello suggerito qui: http://stackoverflow.com/questions/6349161/how-to-generate-a-regular-expression-at-runtime-to-match-a-numeric-range.

    Da quello che dici, però, mi sembra di capire che l'utente debba avere libertà massima, e quindi questa strada non è percorribile.

    In alternativa, puoi pensare ad una sorta di wizard in cui permetti all'utente di scegliere tra un numero limitato di opzioni e, sulla base di esse, costruisci l'espressione regolare. Naturalmente è solo un'idea, non so se è appblicabile al tuo contesto.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    No, l'utente non ha libertà massima ovvero le situazioni sono ristrette (ho scritto il seguente codice)

        Private Function GenerateExpRegolar(ByVal txtRegularExpression As String) As String
            If Not String.IsNullOrWhiteSpace(txtRegularExpression) Then
                Dim expRegular As String = String.Empty
    
                For Each exp In txtRegularExpression.Split(","c)
                    If expRegular = String.Empty Then
                        For i = 0 To exp.Length - 1
                            Select Case i
                                Case 0
                                    If exp(i) = "(" Or exp(i) = "." Or exp(i) = "*" Or exp(i) = "+" Then
                                        expRegular = "(\" & exp(i)
                                    Else
                                        expRegular = "(" & exp(i)
                                    End If
                                Case exp.Length - 1
                                    If exp(i) = "*" Then
                                        expRegular = expRegular & "[^ ]*)"
                                    Else
                                        If exp(i) = ")" Or exp(i) = "." Or exp(i) = "+" Then
                                            expRegular = expRegular & "\" & exp(i) & ")"
                                        Else
                                            expRegular = expRegular & exp(i) & ")"
                                        End If
                                    End If
                                Case Else
                                    If exp(i) = "*" Then
                                        expRegular = expRegular & "[^ ]*"
                                    Else
                                        expRegular = expRegular & "\" & exp(i)
                                    End If
                            End Select
                        Next
                    Else
                        For i = 0 To exp.Length - 1
                            Select Case i
                                Case 0
                                    expRegular = expRegular.Substring(0, expRegular.Length - 1)
                                    If exp(i) = "(" Or exp(i) = "." Or exp(i) = "+" Then
                                        expRegular = expRegular & "|\" & exp(i)
                                    Else
                                        expRegular = expRegular & "|" & exp(i)
                                    End If
                                Case exp.Length - 1
                                    If exp(i) = "*" Then
                                        expRegular = expRegular & "[^ ]*)"
                                    Else
                                        If exp(i) = ")" Or exp(i) = "." Or exp(i) = "+" Then
                                            expRegular = expRegular & "\" & exp(i) & ")"
                                        Else
                                            expRegular = expRegular & exp(i) & ")"
                                        End If
                                    End If
                                Case Else
                                    If exp(i) = "*" Then
                                        expRegular = expRegular & "[^ ]*"
                                    Else
                                        expRegular = expRegular & "\" & exp(i)
                                    End If
                            End Select
                        Next
                    End If
                Next
                Return expRegular
            Else
                Return "(\[^ ])"
            End If
        End Function
    solo che se l'utente mette dentro caratteri speciali va in pallone...gestire tutte le eccezioni non penso sia semplice...:-(

    venerdì 20 aprile 2012 11:42
  • semplice. scrivi la funzione mid:

    dim stringa as string = "ciao(0)"

    dim nuovastringa as string = mid(stringa, 0, stringa.length - 3)

    msgbox(nuovastring) 'il che equivale a dire = "ciao"

    mid funziona cosi: (data una stringa, inizia a contare i caratteri da questa posizione, togli i caratteri da questa posizione)

    venerdì 20 aprile 2012 12:01
  • semplice. scrivi la funzione mid:

    dim stringa as string = "ciao(0)"

    dim nuovastringa as string = mid(stringa, 0, stringa.length - 3)

    msgbox(nuovastring) 'il che equivale a dire = "ciao"

    mid funziona cosi: (data una stringa, inizia a contare i caratteri da questa posizione, togli i caratteri da questa posizione)

    non è così semplice, posso avere anche qualcosa tipo ciao(12) oppure ciao-12 ma assieme anche ciao-2 perchè queste stringhe le posso avere tutte nello stesso file e io devo usare lo stesso metodo per tutte...
    venerdì 20 aprile 2012 12:14
  • io vorrei arrivare ad avere solo e sempre il nome togliendo "()" e numero all'interno di esse. come posso fare

    questo è quello che hai scritto e questa è la soluzione:

    dim stringa as string = "ciao(0)"

    dim nuovastringa as string = mid(stringa, 0, stringa.length - 3)

    quello che chiedi ora e ben diverso. per darti una soluzione mi serve capire esattamente cosa devi fare prima di cominciare a postarti codice a casaccio :)



    sabato 21 aprile 2012 21:50