Italian Caratteri in stringa ...

marco.canta

Active Member
Licensed User
Longtime User
Buongiorno, non riesco a trovare la scorciatoia ... aiuto

Ho una stringa di lunghezza che puo variare e al cui interno ho due caratteri non sempre nella stessa posizione che mi indicano in valori di inizio e fine dati utili.
Ora vorrei prima verificare che in due caratteri sono all interno della stringa e poi identificare la loro posizione cosi da estrarre la parte valori utili.

Io ho pensato a fare un ciclo for che legga la stringa e faccia le condizioni, mi chiedevopero se esiste un'istruzione che estrae gia quello ce mi serve.

Grazie.
Marco
 

MarcoRome

Expert
Licensed User
Longtime User
B4X:
    Dim esempio As String = "Questi sono i due caratteri che 'qui ho la stringa che mi interessa' devo trovare"
    Dim splitta() As String = Regex.Split("\'", esempio)
    Log(splitta(1))
 

LucaMs

Expert
Licensed User
Longtime User
B4X:
    Dim esempio As String = "Questi sono i due caratteri che 'qui ho la stringa che mi interessa' devo trovare"
    Dim splitta() As String = Regex.Split("\'", esempio)
    Log(splitta(1))
Che va benissimo se i due caratteri delimitatori sono uguali (anch'io suppongo di sì).

Se non lo sono:
P1 = TuaStringa.IndexOf(CarattereDelimitatore1)
P2 = TuaStringa.IndexOf(CarattereDelimitatore2)

If P1 <> -1 And P2 <> -1 Then
Parte = TuaStringa.SubString2(P1 + 1, P2)
End If
 

sirjo66

Well-Known Member
Licensed User
Longtime User
ottimo il suggerimento di Luca, ovviamente poi bisogna capire bene la casistica, e quindi ottimizzare il codice di Luca, poichè se per esempio nella stringa c'è prima il carattere CarattereDelimitatore2 e successivamente il CarattereDelimitatore1 il codice va in errore, per cui bisogna filtrare un po' le stringhe in ingresso, ma questo è abbastanza facile

anche il codice di Marco può essere uno spunto, ma vale lo stesso discorso di prima, cioè bisgna prima testare la stringa in ingresso, infatti con
Dim esempio As String = "Questi sono i due caratteri che 'qui ho la stringa che mi int"
(ad esempio perchè la trasmissione si è bloccata oppure non ho ancora ricevuto il resto della stringa) il codice dovrebbe capire che manca il codice di "fine stringa valida"
 

LucaMs

Expert
Licensed User
Longtime User
oppure usi
B4X:
Regex.Split2(pattern1,pattern2,stringa)

anche se non l'ho mai provato


Il secondo parametro di Regex2 non è un pattern:
upload_2017-10-1_6-21-55.png


Purtroppo non c'è documentazione sulle Options ma ho trovato questa risposta di Erel:
The options are Regex.CASE_INSENSITIVE and Regex.MULTILINE.
 

udg

Expert
Licensed User
Longtime User
Non basta utilizzare un pattern tipo:
\'.*\*
per estrarre da una frase tipo "Questi sono i due caratteri che 'qui ho la stringa che mi interessa* devo trovare" la parte che interessa ovvero
'qui ho la stringa che mi interessa*
ossia la stringa con i due diversi delimitatori start/stop?

Nel caso il pattern NON sia verificato sia vrebbe una stringa vuota e il programma potrebbe gestire la cosa segnalando errore oppure attendendo che il buffer si riempia ulteriormente o quello che risukti necessario.

udg
 

micro

Well-Known Member
Licensed User
Longtime User
Presumo che i caretteri delimitatori siano diversi e come suggerito da Luca
buttata così si potrebbe fare
B4X:
Dim startstring, stopstring As Int
Dim stringaok, stringadacontrollare As String
Dim Start = "A" 'delimitatore inizio
Dim Stop = "Z"  'delimitatore fine
........
........
'Ceck se stringadacontrollare.Length > 0
....... 
startstring = stringadacontrollare.IndexOf(Start)
stopstring = stringadacontrollare.IndexOf(Stop)
If (startstring > 0 And stopstring > 0) And (startstring < stopstring) Then
     stringaok = stringadacontrollare.SubString2(Start+1, Stop-1)
Else
     stringaok = Null
End If

Da controllare perchè non provata.
 

MaAncheNo

Member
Licensed User
Longtime User
Credo sia necessario però fare alcune domande prima, come per esempio se la stringa contenga solo caratteri stampabili o anche speciali.
Se la stringa contiene solo i cosiddetti, anticamente:D, "stampabili", da char(32) a char(126) compresi, allora si possono seguire ovviamente i suggerimenti dati fino ad ora, aggiungendo il controllo di errore e usando come delimitatori magari quelli "antichi" (vabbè, si vede che sono vecchio....) come per esempio: 0x02 STX Start of Text e 0x03 ETX End of Text , giusto per delimitare la parte interessata.

Se invece la stringa può contenere tutti i 256 char (lasciamo perdere i set estesi) allora siamo messi male, si devono prima stabilire delle regole.
Ad esempio usare dei doppi caratteri regolamentati ipoteticamente come segue.
Carattere Marker = * , possiamo trovare i seguenti casi:
xxx*xxx -> il marker singolo indica che siamo in presenza di un semplice asterisco
xxx**xxx -> il doppio ** indica che siamo in presenza di un Marker
xxx***xxx -> Questa condizione non è ammessa in quanto non si po' discriminare se ci sia prima un semplice asterisco o un marker
xxx*_**xxx oppure xxx**_*xxx potrebbe aiutare, oppure altre regole che riescano a discriminare quali siano esattamente i "delimitatori".......
 
Top