View Full Version : [javascript]Regular expression
Non riesco a capire come usare bene questo oggetto.
Io vorrei cercare in un testo una frase così composta:
parola_1 parola_2 gruppo_numerico
ad esempio:
pippo pluto 10.103
però gli spazi potrebbero essere anche più di uno e la parola_2 potrebbe anche non esserci, ma vorrei essere sicuro che il gruppo_numerico sia dopo la parola_1, come potrei fare?
Io ho provato così:
var str="ciao mondo 11100";
var reg=new RegExp("(ciao)\s+(mondo)*\s+(11100)","i");
alert(reg.test(str));
Ma mi da sempre false, dove sbaglio?
Da quel che ho capito \s sono gli spazi, + significa una o piò occorrenze e * significa zero o più occorrenze, giusto?
funziona con:
ciao\s*[A-z]*\s*11100
Prova questo:
var str = "ciao mondo 11100";
var reg = new RegExp ("^(\\w+)\\s+((\\w+)\\s+)?(\\d+\\.?\\d+)$", "i");
if (reg.test (str))
{
var arr = reg.exec (str);
alert ("parte1 = [" + arr[1] + "]\r\n" +
"parte2 = [" + arr[3] + "]\r\n" +
"parte3 = [" + arr[4] + "]\r\n");
}Prova a togliere "mondo " e vedrai che arr[3] vale 'undefined'
ho ancora qualche problemino, mettiamo che abbia una stringa così composta:
_blabla bl 123456 blaa_ciao mondo!_bla bla pappapero_
come faccio ad eliminare la parte di testo compresa fra i caratteri '_' senza che sappia com'è composta?
ho provato un str.replace(/_.+_/i,"") ma mi cancella tutta la stringa!
ho ancora qualche problemino, mettiamo che abbia una stringa così composta:
_blabla bl 123456 blaa_ciao mondo!_bla bla pappapero_
come faccio ad eliminare la parte di testo compresa fra i caratteri '_' senza che sappia com'è composta?
ho provato un str.replace(/_.+_/i,"") ma mi cancella tutta la stringa!Ci siamo quasi ... ma c'è una piccola questione che non hai considerato (o probabilmente non conosci). L'espressione X+ è un quantificatore definito "greedy" (=avido, ingordo) perché cerca di catturare il massimo numero di caratteri possibili. Quindi, con la stringa di input sopra, cattura tutto ciò che c'è tra il primo _ e l'ultimo _ (quello dopo pappapero) e non solo fino al _ dopo blaa (come si vorrebbe).
La soluzione è usare un quantificatore non greedy.
str.replace(/_.+?_/gi,"")
Il '?' rende il quantificatore non greedy, adesso cerca di catturare il minor numero di caratteri. Il flag 'g' serve per continuare nel replace, così non si ferma al primo match.
Grazie mille chiarissimo!
Certo che è potente come cosa, con sti affari si riesce a fare quasi ogni tipo lavorazione sulle stringhe :D
ed è anche abbastanza veloce.
se devo cercare una parola all'interno di una stringa che contiene molte righe, e ne devo ricavare la sola riga che contiene la parola come faccio?
ad esempio ho:
_eijfjehbjcfrhguivrbjkvbjrkbcvrvucrubr CIAO rejfbeurbfierbfcirbgviyvryvrbhcr_
_urefgurigfurgfuirgfvurguivgruvgyrgvirgvuirgvuirurgvuirgvuirguivgruivgruvgruivuir_
_roivhruivgurrkjfrlihvrkgvurgvuigrvuigrviugruvgruvgurgvuigruivgruivgr_
e devo ricavare solo la prima riga perchè contiene la parola CIAO.
Tutte le righe iniziano e finiscono con il medesimo carattere.
ho provato con str.match(/_.+?CIAO.+?_/gi);
ma mi da anche le altre righe...
ho provato con str.match(/_.+?CIAO.+?_/gi);A me sembra corretto.
bho a me nn funziona cmq ho risolto in un altro modo.
Ora mi serve l'ultimo ritocchino, presente i caratteri > < & " ecc ecc, che per scriverli in codice html vanno inseriti con > < " &
ecco, se io ho una stringa con quei caratteri, c'è un modo per rimpiazzarli con il rispettivo codice asci tutti in una volta?
es.
var str=ciao "pippo" 10>5
avere ciao"pippo" 10>5
altrimenti dovrei fare tanti replace uno per ogni caso.
Sto lavorando in javascript sempre
anche xkè i caratteri speciali sn questi:
¢ = ¢
£ = £
¤ = ¤
¥ = ¥
¦ = ¦
§ = §
¨ = ¨
© = ©
ª = ª
« = «
¬ = ¬
® = ®
¯ = ¯
° = °
± = ±
² = ²
³ = ³
´ = ´
µ = µ
¶ = ¶
· = ·
¸ = ¸
¹ = ¹
º = º
» = »
¼ = ¼
½ = ½
¾ = ¾
¿ = ¿
À = À
Á = Á
 = Â
à = Ã
Ä = Ä
Å = Å
Æ = Æ
Ç = Ç
È = È
É = É
Ê = Ê
Ë = Ë
Ì = Ì
Í = Í
Î = Î
Ï = Ï
Ð = Ð
Ñ = Ñ
Ò = Ò
Ó = Ó
Ô = Ô
Õ = Õ
Ö = Ö
× = ×
Ø = Ø
Ù = Ù
Ú = Ú
Û = Û
Ü = Ü
Ý = Ý
Þ = Þ
ß = ß
à = à
á = á
â = â
ã = ã
ä = ä
å = å
æ = æ
ç = ç
è = è
é = é
ê = ê
ë = ë
ì = ì
í = í
î = î
ï = ï
ð = ð
ñ = ñ
ò = ò
ó = ó
ô = ô
õ = õ
ö = ö
÷ = ÷
ø = ø
ù = ù
ú = ú
û = û
ü = ü
ý = ý
þ = þ
ÿ = ÿ
" = "
& = &
< = <
> = >
€ = €
ˆ = ˆ
˜ = ˜
… = …
™ = ™
E se devo fare i casi per tutti non finisco più!!!
altrimenti dovrei fare tanti replace uno per ogni caso.Esatto :asd: ... non ci sono funzioni "standard" per fare questo in Javascript. Fai tanti replace per ogni entità, almeno per le 5 entità "standard".
anche xkè i caratteri specialiPer quale motivo devi ottenere le entità per tutti i caratteri speciali?? Se nella stringa i caratteri speciali sono codificati con lo stesso charset dichiarato in testa al html, allora puoi "buttare" fuori direttamente il carattere.
Ho ancora dei problemi uff...
Ho del testo con tante righe, tutte le righe iniziano con lo stesso gruppo di caratteri e finiscono tutte con lo stesso gruppo di caratteri, ma al loro interno possono avere qualsiasi carattere, anche dei tab, dei return ecc ecc.
Es
abc bla blakjhndefhnerhcf xejcengchr crjivhc iur vrcv rcvoirhciur zzz
abc bla blakjhndefhnerhcf xejcengchr crjivhc iur vrcv rcvoirhciur zzz
abc bla blakjhndefhnerhcf xe KEY hr crjivhc iur vrcv rcvoirhciur zzz
abc bla blakjhndefhnerhcf xejcengchr crjivhc iur vrcv rcvoirhciur zzz
a me interessa avere tutta la riga che contiene la parola KEY.
se faccio un
abc.+?KEY.+?zzz non funziona perchè come ho già detto possono esserci anche dei \n \r che il . non comprende... e in più non so per quale motivo ma mi prende dal primo abc che incontra fino a KEY
Secondo me per questo genere di cose c'è un qualcosa di più avanzato.
Non c'è qualcosa per dirgli, guarda il più vicino possibile alla parola KEY?
se faccio un
abc.+?KEY.+?zzz non funziona perchè come ho già detto possono esserci anche dei \n \r che il . non comprende... e in più non so per quale motivo ma mi prende dal primo abc che incontra fino a KEY
Secondo me per questo genere di cose c'è un qualcosa di più avanzato.
Non c'è qualcosa per dirgli, guarda il più vicino possibile alla parola KEY?Ecco:
abc(?:.|[\r\n])+?KEY(?:.|[\r\n])+?zzz
Il significato di (?:.|[\r\n]) è semplice: è un raggruppamento (senza capturing) di qualunque carattere oppure \r o \n
Ma mi prende tutte le righe così xò
Ma mi prende tutte le righe così xòGià, è vero! Diciamo che prende più righe del necessario. Ho fatto adesso la prova con questo testo:
abc 11 xxx 111 zzz
abc 22 KEY 222 zzz
abc 33 yyy 333 zzz
abc 44 KEY 444 zzz
con il flag 'g' darebbe un array di 2 elementi, il primo prende le prime due righe e il secondo le altre due. Dopotutto, se accetti di poter avere in mezzo un newline, come farebbe a capire che vuoi solo:
abc 22 KEY 222 zzz
e non
abc 11 xxx 111 zzz
abc 22 KEY 222 zzz
?
Bisognerebbe ragionarci un po' su .... non saprei ....
Quindi se ho:
abc jrfbekj
rnfnrfnrfn rfcnr rornfr zzz
abc rkfnrjfnrjnf lrfkrf KEY rkfnrl
rnfkrnfr zzz
Non posso isolare il gruppo abc-zzz che ha in mezzo KEY?
Ci sono riuscito! Ecco l'espressione:
abc((.|\r|\n)(?!abc))+?KEY(.|\r|\n)+?zzz
da usare con il flag 'g' e da eseguire con il metodo match() di String.
si c'ero arrivato anche io stamattina, xò mi sn accorto che il gruppo zzz a volte manca quindi il fine stringa diventa un abc.
Ho provato questo:
abc((.|\n)(?!abc))+?KEY(.|\n)+?(zzz|abc) ma così torna a prendermi tutto...
Per questo motivo sono passato allo split, in questo modo:
var row=str.split("KEY");
var s1=row[0].split("abc")[1];
var s2=row[1].split(/abc|zzz/)[0];
var tot=s1+"KEY"+s2;
ecco così funziona, ma a volte la parola KEY è presente più volte nella stessa riga, quindi ho fatto:
var arr=str.split("KEY");
var s1=arr.splice(0,1)[0].split("abc")[1];
var s2=arr.join("KEY").split(/abc|zzz/)[0];
var tot=s1+"KEY"+s2;
e così ho risolto ma ora è sensibilmente più lento l'algoritmo.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.