Cercare una stringa senza distinzione tra maiuscole e minuscole

di il
18 risposte

Cercare una stringa senza distinzione tra maiuscole e minuscole

Buongiorno,

devo cercare una stringa all'interno di un'altra senza distinzione tra maiuscole e minuscole, ho scritto il seguente codice:

  Dim comp As StringComparison = StringComparison.OrdinalIgnoreCase
            If currentRow.Contains("Plus", comp) Then
                TBPlus.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
            End If

ma segnala l'errore: 

BC30311    Non è possibile convertire il valore di tipo 'StringComparison' in 'IEqualityComparer(Of Char)'.  
non capisco come funziona StringComparison, qualche suggerimento?

Grazie

Giorgio

18 Risposte

  • Re: Cercare una stringa senza distinzione tra maiuscole e minuscole

    12/02/2025 - Giorgio ha scritto:

    BC30311    Non è possibile convertire il valore di tipo 'StringComparison' in 'IEqualityComparer(Of Char)'.  
    non capisco come funziona StringComparison, qualche suggerimento?

    La variabile currentRow di che tipo è?
    Posta anche quella parte del codice.

  • Re: Cercare una stringa senza distinzione tra maiuscole e minuscole

    12/02/2025 - Giorgio ha scritto:

    BC30311    Non è possibile convertire il valore di tipo 'StringComparison' in 'IEqualityComparer(Of Char)'.  
    non capisco come funziona StringComparison, qualche suggerimento?

    magari trova una riga vuota...

    prova controllando la riga:

    Dim comp As StringComparison = StringComparison.OrdinalIgnoreCase
    If currentRow.Contains("Plus", comp) Then
        If Posuguale >= 0 AndAlso Posuguale < currentRow.Length Then
            TBPlus.Text = currentRow.Substring(Posuguale, currentRow.Length - Posuguale)
        End If
    End If
  • Re: Cercare una stringa senza distinzione tra maiuscole e minuscole

    Allego il codice intero:

    Dim righe() As String = File.ReadAllLines(CartPregeoConfig & FilePregeoConfig)
    
            For Each currentRow As String In righe
                If currentRow = "" Or Mid(currentRow, 1, 1) = ";" Then Continue For
                Dim comp As StringComparison = StringComparison.OrdinalIgnoreCase
    			If currentRow.Contains("Plus", comp) Then
        			If Posuguale >= 0 AndAlso Posuguale < currentRow.Length Then
            		TBPlus.Text = currentRow.Substring(Posuguale, currentRow.Length - Posuguale)
        			End If
    			End If
            Next
    

    Le righe vuote e quelle che iniziano con ";" vengono escluse

  • Re: Cercare una stringa senza distinzione tra maiuscole e minuscole

    E PosUguale cosa è?

  • Re: Cercare una stringa senza distinzione tra maiuscole e minuscole

    12/02/2025 - sihsandrea ha scritto:

    magari trova una riga vuota...

    Una riga vuota nel file non ti da un errore in fase di compilazione. :)

    12/02/2025 - Giorgio ha scritto:

    Allego il codice intero: [...]

    Ok, svelato l'arcano, che in effetti a prima vista era abbastanza subdolo. :)

    Il problema è che nel .NET Framework non c'è un metodo Contains() per le stringhe, ma esiste per le "enumerazioni" (liste, array, ecc.) grazie a LINQ.

    La stringa è di fatto una "enumerazione di caratteri", quindi il Contains() che stai utilizzando serve a verificare se un elemento è presente nell'insieme, quindi se un certo carattere si trova nella stringa.

    Usa un altro approccio, ad esempio String.IndexOf(), per determinare la presenza di una stringa all'interno di un'altra ottenendo l'indice della sua posizione: se è uguale o maggiore di zero, la stringa è presente.

    		If currentRow.IndexOf("Plus", comp) >= 0 Then
    			If Posuguale >= 0 AndAlso Posuguale < currentRow.Length Then
    				TBPlus.Text = currentRow.Substring(Posuguale, currentRow.Length - Posuguale)
    			End If
    		End If

    Vedi la documentazione per ulteriori riferimenti.

  • Re: Cercare una stringa senza distinzione tra maiuscole e minuscole

    Secondo me la cosa più semplice è utilizzare le RegularExpressions, ad esempio:

    Imports System.Text.RegularExpressions
    
            Dim parolaDaCercare = "Plus"
            Dim currentRow = "questo testo è una prova e un plus per noi"
            Dim reg = Regex.Match(currentRow, parolaDaCercare, RegexOptions.IgnoreCase)
    
            If reg.Success Then ' ho trovato la parola !!!
                TBPlus.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
            End If

    però c'è da capire se vuoi proprio controllare la parola intera o solo una parte di essa, cioè:
    se hai la stringa "questo testo di prova serve per complussare la differenza vocale", cercando "Plus" vuoi che te la trova lo stesso oppure no perchè cerchi proprio la parola "plus" ???

    nel caso devi modificare in:

    Dim parolaDaCercare = "\bPlus\b"
  • Re: Cercare una stringa senza distinzione tra maiuscole e minuscole

    12/02/2025 - SirJo ha scritto:

    Secondo me la cosa più semplice è utilizzare le RegularExpressions, ad esempio:

    Imports System.Text.RegularExpressions
    
            Dim parolaDaCercare = "Plus"
            Dim currentRow = "questo testo è una prova e un plus per noi"
            Dim reg = Regex.Match(currentRow, parolaDaCercare, RegexOptions.IgnoreCase)
    
            If reg.Success Then ' ho trovato la parola !!!
                TBPlus.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
            End If

    però c'è da capire se vuoi proprio controllare la parola intera o solo una parte di essa, cioè:
    se hai la stringa "questo testo di prova serve per complussare la differenza vocale", cercando "Plus" vuoi che te la trova lo stesso oppure no perchè cerchi proprio la parola "plus" ???

    nel caso devi modificare in:

    Dim parolaDaCercare = "\bPlus\b"

    Deve cercare la parola intera, quindi, se ho capito bene:

    Dim parolaDaCercare = "Nome"
            Dim currentRow = "Cognome"
            reg.success=False
          
            Dim parolaDaCercare = "\bNome\b"
            Dim currentRow = "Cognome"
            reg.success=True        

    Giusto?

  • Re: Cercare una stringa senza distinzione tra maiuscole e minuscole

    Ciao, per come hai descritto e non avendo precisato cosa contenga Posuguale;

    Esempio... poniamo che Posuguale = 20
    poniamo che all'interno del ciclo For Each legga una riga che contiene la frase : "Oggi non piove plus speriamo che domani ci sia il sole"

    in TBPlus.Text troveremo la stringa "speriamo che domani ci sia il sole"

    ..... Ricerca "Plus" come ti hanno già suggerito

    Dim righe() As String = File.ReadAllLines(CartPregeoConfig & FilePregeoConfig)
    
    For Each currentRow As String In righe
        If currentRow = "" OrElse currentRow.StartsWith(";") Then Continue For
        
        ' Ricerca "Plus" come ti hanno già suggerito
        If currentRow.IndexOf("Plus", StringComparison.OrdinalIgnoreCase) >= 0 Then
            If Posuguale >= 0 AndAlso Posuguale < currentRow.Length Then
                TBPlus.Text = currentRow.Substring(Posuguale, currentRow.Length - Posuguale)
            End If
        End If
    Next
  • Re: Cercare una stringa senza distinzione tra maiuscole e minuscole

    Dim parolaDaCercare = "Nome"
            Dim currentRow = "Cognome"
            reg.success=False
          
            Dim parolaDaCercare = "\bNome\b"
            Dim currentRow = "Cognome"
            reg.success=True        

    Giusto?

    No, esattamente il contrario cioè:

    Dim parolaDaCercare = "Nome"
    Dim currentRow = "Cognome"
    reg.success=True
          
    Dim parolaDaCercare = "\bNome\b"
    Dim currentRow = "Cognome"
    reg.success=False
  • Re: Cercare una stringa senza distinzione tra maiuscole e minuscole

    12/02/2025 - By65Franco ha scritto:

    Ciao, per come hai descritto e non avendo precisato cosa contenga Posuguale;

    Esempio... poniamo che Posuguale = 20
    poniamo che all'interno del ciclo For Each legga una riga che contiene la frase : "Oggi non piove plus speriamo che domani ci sia il sole"

    in TBPlus.Text troveremo la stringa "speriamo che domani ci sia il sole"

    ..... Ricerca "Plus" come ti hanno già suggerito

    Dim righe() As String = File.ReadAllLines(CartPregeoConfig & FilePregeoConfig)
    
    For Each currentRow As String In righe
        If currentRow = "" OrElse currentRow.StartsWith(";") Then Continue For
        
        ' Ricerca "Plus" come ti hanno già suggerito
        If currentRow.IndexOf("Plus", StringComparison.OrdinalIgnoreCase) >= 0 Then
            If Posuguale >= 0 AndAlso Posuguale < currentRow.Length Then
                TBPlus.Text = currentRow.Substring(Posuguale, currentRow.Length - Posuguale)
            End If
        End If
    Next

    Ho già provato il tuo codice è funziona almeno in parte, ma se devo cercare la stringa "Nome" e currentRow è "Cognome" mi attiva If ma è sbagliato. Per quanto riguarda Posuguale serve per un altro scopo. 

  • Re: Cercare una stringa senza distinzione tra maiuscole e minuscole

    12/02/2025 - SirJo ha scritto:

    Dim parolaDaCercare = "Nome"
            Dim currentRow = "Cognome"
            reg.success=False
          
            Dim parolaDaCercare = "\bNome\b"
            Dim currentRow = "Cognome"
            reg.success=True        

    Giusto?

    No, esattamente il contrario cioè:

    Dim parolaDaCercare = "Nome"
    Dim currentRow = "Cognome"
    reg.success=True
          
    Dim parolaDaCercare = "\bNome\b"
    Dim currentRow = "Cognome"
    reg.success=False

    Non capisco, a me da il contrario e ho provato più volte

  • Re: Cercare una stringa senza distinzione tra maiuscole e minuscole

    Questo codice a me risponde True:

            Dim parolaDaCercare = "Nome"
            Dim currentRow = "Cognome"
            Dim reg = Regex.Match(currentRow, parolaDaCercare, RegexOptions.IgnoreCase)
            MessageBox.Show(reg.Success.ToString)

    questo codice mi risponde False:

            Dim parolaDaCercare = "\bNome\b"
            Dim currentRow = "Cognome"
            Dim reg = Regex.Match(currentRow, parolaDaCercare, RegexOptions.IgnoreCase)
            MessageBox.Show(reg.Success.ToString)
  • Re: Cercare una stringa senza distinzione tra maiuscole e minuscole

    12/02/2025 - Giorgio ha scritto:

    Non capisco, a me da il contrario e ho provato più volte

    Non potresti semplicemente specificare queste  cose?

    1. qual è l'obiettivo da ottenere nello specifico, dettagliando con un esempio preciso,
    2. postare il codice che hai scritto, che sia almeno completo nella parte significativa.

    Si è partiti da un problema, poi è stata tirata in ballo la Regex (non sembrava servisse, ma se è necessario allora stiamo parlando di un altro problema oppure è stato ampliato il raggio).

    Alla fine, tra codice reale e codice errato (perché la riga "reg.Success =  True" non ha sicuramente senso visto che la proprietà Success si legge e non si scrive), non si capisce nulla e si va avanti per tentativi, senza capire realmente quello che è stato scritto e quello che invece è differente.

    12/02/2025 - Giorgio ha scritto:

    Non capisco, a me da il contrario e ho provato più volte

    Appunto. Se il tuo codice da un risultato diverso da quello di un altro, vuol dire che il codice è diverso.
    Bisogna capire cosa è stato scritto di preciso, non una cosa come questa che non è codice compilabile:

    Dim parolaDaCercare = "\bNome\b"
    Dim currentRow = "Cognome"
    reg.success=False

    Se non si adotta un minimo di precisione, si rischia di non capirci nulla e di continuare una discussione chilometrica senza riuscire a centrare il problema, che è il primo passo per ipotizzare una soluzione efficace.

  • Re: Cercare una stringa senza distinzione tra maiuscole e minuscole

    Ringrazio tutti per l'aiuto, mi scuso se ho creato confusione, comunque ho risolto con il seguente codice (completo), optando per la soluzione con Regex:

    Private Sub Carica_File()
            Dim readText() As String = File.ReadAllLines(dirApplicationData & "\Preferenze.tfm")
            Dim CartPregeoConfig As String = readText(2) & "EXE\"
            Dim FilePregeoConfig As String = "Pregeo.config"
            Dim incr As Integer
            Dim PosNomeR As Integer
            Dim righe() As String = File.ReadAllLines(CartPregeoConfig & FilePregeoConfig)
            Dim reg As Match
            Me.Text = "Configurazione del file " & CartPregeoConfig & FilePregeoConfig
            For Each currentRow As String In righe
                If currentRow = "" Or Mid(currentRow, 1, 1) = ";" Then Continue For
                incr += 1
                If currentRow.IndexOf("[DATI REDATTORE]", StringComparison.OrdinalIgnoreCase) >= 0 Then PosNomeR = incr + 2
                Dim Posuguale As Integer = InStr(currentRow, "=")
    
                'Tabella Font
                reg = Regex.Match(currentRow, "NomeFontPol", RegexOptions.IgnoreCase)
                If reg.Success Then
                    TBNomeFontPol.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
                reg = Regex.Match(currentRow, "NumMaxRighePol", RegexOptions.IgnoreCase)
                If reg.Success Then
                    TBNumMaxRighePol.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
                reg = Regex.Match(currentRow, "NomeFont", RegexOptions.IgnoreCase)
                If reg.Success Then
                    TBNomeFont.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
                reg = Regex.Match(currentRow, "NumMaxRighe", RegexOptions.IgnoreCase)
                If reg.Success Then
                    TBNumMaxRighe.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
    
                'Tabella DISCHI
                reg = Regex.Match(currentRow, "FILE_DISTANZETAF", RegexOptions.IgnoreCase)
                If reg.Success Then
                    TBFileDistTaf.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
                reg = Regex.Match(currentRow, "DskAPPLexe", RegexOptions.IgnoreCase)
                If reg.Success Then
                    TBDskAPPLexe.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
                reg = Regex.Match(currentRow, "DskAPPLada", RegexOptions.IgnoreCase)
                If reg.Success Then
                    TBDskAPPLada.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
                reg = Regex.Match(currentRow, "DskAPPLtmp", RegexOptions.IgnoreCase)
                If reg.Success Then
                    TBDskAPPLtmp.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
    
                'Tabella Plus
                reg = Regex.Match(currentRow, "Plus", RegexOptions.IgnoreCase)
                If reg.Success Then
                    TBPlus.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
                reg = Regex.Match(currentRow, "calcolo esteso", RegexOptions.IgnoreCase)
                If reg.Success Then
                    TBCalcoloEsteso.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
    
                'Tabella Versione
                reg = Regex.Match(currentRow, "Versione", RegexOptions.IgnoreCase)
                If reg.Success Then
                    TBVersione.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
                reg = Regex.Match(currentRow, "Data", RegexOptions.IgnoreCase)
                If reg.Success Then
                    TBData.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
    
                'Tabella Dati redattore
                reg = Regex.Match(currentRow, "sigla prov.", RegexOptions.IgnoreCase)
                If reg.Success Then
                    TBSigla_Prov.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
                If PosNomeR > 0 Then
                    reg = Regex.Match(currentRow, "\bnome\b", RegexOptions.IgnoreCase)
                    If reg.Success Then
                        TBNome.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                    End If
                End If
                reg = Regex.Match(currentRow, "cognome", RegexOptions.IgnoreCase)
                If reg.Success Then
                    TBCognome.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
                reg = Regex.Match(currentRow, "qualifica", RegexOptions.IgnoreCase)
                If reg.Success Then
                    CBoxQualifica.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
                If PosNomeR > 0 Then
                    reg = Regex.Match(currentRow, "provincia", RegexOptions.IgnoreCase)
                    If reg.Success Then
                        TBProvincia.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                        PosNomeR = 0
                    End If
                End If
                reg = Regex.Match(currentRow, "numero", RegexOptions.IgnoreCase)
                If reg.Success Then
                    TBNumero.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
                reg = Regex.Match(currentRow, "codc", RegexOptions.IgnoreCase)
                If reg.Success Then
                    TBCodiceFiscale.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
    
                'Tabella LAST PROT
                reg = Regex.Match(currentRow, "ultimoprot", RegexOptions.IgnoreCase)
                If reg.Success Then
                    TBUltimoProt.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                End If
    
    
    
                'Tabella PROV DI COMPETENZA
                reg = Regex.Match(currentRow, "provincia", RegexOptions.IgnoreCase)
                If reg.Success Then
                    If Len(currentRow) = 12 Then
                        TBProvComp.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                    End If
                End If
    
                'Tabella DATI TECNICO
                If PosNomeR = 0 Then
                    reg = Regex.Match(currentRow, "\bnome\b", RegexOptions.IgnoreCase)
                    If reg.Success Then
                        TBNomeTecnico.Text = currentRow.Substring(Posuguale, Len(currentRow) - Posuguale)
                    End If
                End If
            Next
        End Sub

    il contenuto del  file Pregeo.config è variabile, il file che ho utilizzato nel codice è così costituito:

    [Font]
    NomeFontPol = COURIER New
    NumMaxRighePol = 90
    NomeFont = COURIER New
    NumMaxRighe = 65
    [DISCHI]
    DskAPPLexe=C:
    DskAPPLada=C:
    DskAPPLtmp=C:
    [Plus]
    Plus = S
    calcolo esteso = S
    [Versione]
    Versione = 10.00
    Data=13/02/2025
    [DATI REDATTORE]
    sigla prov.=XX
    nome=PINCO
    cognome=PALLINO
    qualifica=PERITO
    provincia=XXXXXX
    numero=5215
    codc=PNCPLL60D12A80L
    [LAST_PROT]
    ultimoprot=202545
    [PROV_DI_COMP]
    provincia=XX

    [DATI TECNICO]
    nome=PALLINO PINCO

    Saluti

    Giorgio

Devi accedere o registrarti per scrivere nel forum
18 risposte