razvandragos29 Posted November 20, 2015 Report Posted November 20, 2015 Salut incerc sa fac split la un string folosind mai multi delimitatori. Stringul este urmatorul String s = " (MM + X + C - L) * (IX - I) "; .Prima oara am eliminat spatiile albe cu ajutorul lui replaceAll si dupa am apelat la metoda split folosind linia urmatoare String[] split = s.split("\\+|\\)|\\-|\\(|\\*|\\s");Insa am o problema eu din stringu de mai sus vreau sa scot doar numerele romane MM , X, C etc. Insa in array split am si 3 spatii albe . Acesta e tot codul public class Split { public static void main(String args[]){ String s = " (MM + X + C - L) * (IX - I) "; s= s.replaceAll("\\s",""); System.out.println(s); String[] split = s.split("\\+|\\)|\\-|\\(|\\*|\\s"); for(int i = 0; i < split.length ; i++){ System.out.println(split[i]); } }} Am nevoie de numerele romane din expresie deoarece trebuie sa le convertesc in numere arabe dupa pe fiecare in parte. Quote
S.L.C Posted November 21, 2015 Report Posted November 21, 2015 (edited) Nu am programat in Java pana acum dar din cate vad eu aici este o problema de regular expressions. La care ai urmatoarele optiuni:String[] split = s.split("[\\+|\\)|\\-|\\(|\\*|\\s]+");SauString[] split = s.split("[^a-zA-Z]+");Daca observi ambele contin un set de caractere [...] Primul se aplica la oricare delimitator specificat de tine inclusiv spatiul. Urmatorul se aplica la oricare caracter ce nu este alfabetic.Ce trebuie sa observi tu in ambele este cuantificatorul '+' ce urmeaza dupa setul de carcatere. Acel plus face ca setul de caractere la care se aplica sa apara de 1 sau mai multe ori. De ce este asta important?Sa observam textul tau:(MM+X+C-L)*(IX-I)Mai exact portiunea:)*(Aici sunt 3 caractere care satisfac criteriile cerute de setul tau. Si din moment ce setul tau (fara '+') se aplica doar la un caracter. Atunci fiecare caracter este considerat un delimitator si genereaza un text gol deoarece intre el si urmatorul caracter (care la randul sau satisface criteriile cerute de set) nu se afla nimic.Adaugand '+' la sfarsitul setului face ca toate caracterele sa sa fie tratate precum un singur delimitator. Deoarece se potrivesc criteriului de 1 sau mai multe cerute de cuantificatorul '+'.Partea buna este ca nici nu ai nevoie sa indepartezi spatiile:s= s.replaceAll("\\s","");Deoarece unul sau mai multe spatii este/sunt tratat(e) precum un singur delimitator.P.S. Scuze pentru Romana mea de rahat. Sper sa poti intelege ce am spus Edited November 21, 2015 by S.L.C Quote
tjt Posted November 21, 2015 Report Posted November 21, 2015 Din ce am observat incerci sa faci un calculator pentru cifre romane.Abordezi gresit problema utilizand split.Cel mai bine transformi respectiva expresie in forma postfixata si dupa o rezolvi mult mai usor. Cu split o sa te complici prea mult.Edit: Ca sa scoti numerele romane parcurgi expresia, atunci cand intalnesti o litera incepi sa copiezi pana cand urmatorul caracter e diferit de litera. si tot asa. Quote