Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 7 su 7

Operatore LIKE e Pattern

  1. #1
    L'avatar di @Alex
    @Alex non è in linea Very Important Person
    Post
    16,745
    Like Inviati  
    0
    Like Ricevuti  
    20
    Prima di pensare a RegEX, voglio capire se con LIKE sia fattibile la discriminazione di cui ho bisogno.

    Devo individuare una SubStringa all'interno di una Stringa, le casistiche sono queste:

    Str1="txtA" <--- Stringa da cercare

    Casistiche:
    Str2="Me!txtA.Value"
    Str2="Me![txtA].Value"
    Str2="Sub txtA_Change()"
    Str2="Me.txtA.Value"
    Str2="Me!txtA!pippo"
    
    Quindi, prima posso avere:
    "![._ "
    e dopo:
    "!]._ "

    Si tratta di testo VBA da testare, e può, nella sua sintassi assumere queste casistiche.

    Sapendo che i caratteri speciali come i brackets devono essere raddoppiati... ed inseriti nella lista... ho pensato ad una cosa simile:
    Str2 Like "*[[.!_ ]" & str1 & "[.!_ ]]*"
    
    La cosa strana è che il Pattern iniziale funziona, mentre quello finale no...!
    Esempio:
    ? "Me[txtA.Value" Like "*[[[.!_ ]txtA*"  ' raddoppio 
    Vero
    
    ? "Me[txtA.Value" Like "*[[.!_ ]txtA*"   ' senza raddoppio
    Vero
    
    ? "Me[txtA.Value" Like "*[[.!_ ]txtA[!. ]]*"
    Falso
    
    Ma se tolgo il raddoppio del brackets in chiusura va ma ovviamente non lo riconosce..
    ? "Me[txtA.Value" Like "*[[.!_ ]txtA[!. ]*"
    Vero
    
    ? "Me[txtA.Value" Like "*[[[.!_ ]txtA[!. ]*"   ' raddoppio 
    Vero
    
    ? "Me[txtA]Value" Like "*[[ _!.]txtA[.!_ ]*"
    Falso
    
    Ovviamente anche il [!] è uno Special Char... che ho anche provato a racchiudere e raddoppiare...

    In sostanza non so se sbaglio il Pattern in chiusura della stringa o se è un baco... penserei alla prima... ma non ce ne vado fuori...
    Ultima modifica di @Alex; 28-12-2020 13:23 
    ℹ️ Leggi di più su @Alex ...

  2. #2
    Post
    1,868
    Blogs
    21
    Like Inviati  
    13
    Like Ricevuti  
    11
    Ciao @Alex,

    non sono sicuro , mi sa che la quadra chiusa non puoi usarla in un gruppo "By design"

    anche se è per .NET ,vedi Caratteri speciali qui
    https://docs.microsoft.com/it-it/dot.../like-operator

    HTH
    Ultima modifica di sspintux; 28-12-2020 13:33 
    ℹ️ Leggi di più su sspintux ...

  3. #3
    L'avatar di @Alex
    @Alex non è in linea Very Important Person
    Post
    16,745
    Like Inviati  
    0
    Like Ricevuti  
    20
    Quote Originariamente inviato da sspintux Visualizza il messaggio
    Ciao @Alex,

    mi sa che la quadra chiusa non puoi usarla in un gruppo "By design"

    anche se è per .NET ,vedi Caratteri speciali qui
    https://docs.microsoft.com/it-it/dot.../like-operator

    HTH
    Ciao, era quello che temevo... anche se, leggendo bene l'articolo in italiano, io lo avevo guardato in Inglese e mi lasciava perplesso, ma in Italiano toglie i dubbi... solo che non va, riporto la frase
    La parentesi quadra chiusa ( ] ) non può essere usata all'interno di un gruppo per trovare la corrispondenza, 
    ma può essere usata all'esterno di un gruppo come singolo carattere.
    
    Questo mi fa pensare che se lo uso come singolo carattere, ed ovviamente funziona, mi vincola..
    ? "Me!txtA]Value " Like "*[!.]txtA]*"
    Vero
    
    Purtroppo quel carattere è parte della variabilità, sicchè temo che dovrò operare un REPLACE... non mi piace ma...
    ℹ️ Leggi di più su @Alex ...

  4. #4
    Post
    1,868
    Blogs
    21
    Like Inviati  
    13
    Like Ricevuti  
    11
    mi verrebbe da pensare ad un'altra like in or
    ℹ️ Leggi di più su sspintux ...

  5. #5
    L'avatar di @Alex
    @Alex non è in linea Very Important Person
    Post
    16,745
    Like Inviati  
    0
    Like Ricevuti  
    20
    Ho testato questa, che secondo me, è in linea con la tua idea, ovvero spezzare il problema in 2:
    Function IsMatching(sIn As String, s2S As String) As Boolean
       If sIn Like "*[" & s2S & "]*" Then
          sIn = Replace(sIn, "[" & s2S & "]", "<" & s2S & ">")
       End If
       IsMatching= (" " & sIn & " ") Like "*[[ _!.'<]" & s2S & "['>.!_ ]*"
    End Function
    
    Test
    ? IsMatching("Me![txt].Value","txt")
    Vero
    
    Di fatto essendo codice VBA da parsare, se ho la quadra prima devo averla dopo...!
    Piuttosto di scomodare un'istanza di RegEX direi che potrebbe anche andare...
    Ultima modifica di @Alex; 28-12-2020 14:37 
    ℹ️ Leggi di più su @Alex ...

  6. #6
    Post
    1,868
    Blogs
    21
    Like Inviati  
    13
    Like Ricevuti  
    11
    pensavo ad una OR nel senso gestire a parte il caso di parentesi quadre e senza;

    sinceramente non ho fatto molte prove , ma una cosa tipo:

    sIn="Me![txtA].Value"
    sP1="*[.!_ ]txtA[.!_ ]*"  'caso senza quadre
    sP2="*[[]txtA][.!_ ]*"   'caso con quadre
    Print sIn Like  sP1 OR sIn like sP2
    
    ... ma se hai risolto va benissimo
    ℹ️ Leggi di più su sspintux ...

  7. #7
    L'avatar di @Alex
    @Alex non è in linea Very Important Person
    Post
    16,745
    Like Inviati  
    0
    Like Ricevuti  
    20
    Chiarissimo, e direi che mi piace di più così fosse solo per una questione di pulizia...!
    Grazie, una birra
    ℹ️ Leggi di più su @Alex ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Operatore like su mdb
    Da kar64 nel forum Visual Basic .Net
    Risposte: 2
    Ultimo Post: 06-10-2019, 09:54
  2. Pattern Singleton
    Da Skary nel forum Altri linguaggi e strumenti
    Risposte: 3
    Ultimo Post: 03-02-2013, 16:54
  3. Risposte: 3
    Ultimo Post: 02-05-2010, 11:44
  4. [C] Pattern matching
    Da j0k3rz nel forum C/C++
    Risposte: 0
    Ultimo Post: 15-10-2006, 21:20
  5. Risposte: 4
    Ultimo Post: 12-11-2005, 18:30