2016-05-14 28 views
5

Ho un'equazione: +8x2+10y2-99+5=99. Ho bisogno di separare i valori numerici solo senza combinazione di caratteri alfabetici. Ho usato la regex str.match(/[0-9]/g) per ottenere tutti i valori numerici, ma per l'equazione sopra, i risultati dovrebbero essere -99,5,99.Come trovare solo valori numerici senza combinazione di valori alfabetici usando regex?

+3

Hai impostato una taglia per questa domanda, ma la tua vera intenzione è ottenere una risposta * da fonti credibili e/o ufficiali *? Hai 2 risposte che sono già credibili. –

risposta

3

Riffing sul tuo approccio originale, possiamo costruire una soluzione solida e imparare un po 'su come funzionano alcune caratteristiche regex aggiuntive.

In primo luogo, aggiungiamo il supporto per la separazione degli alfabeti. Ciò può essere fatto utilizzando il metacarattere \b, che fornisce una corrispondenza virtuale solo nel punto di transizione tra un carattere di parola e un carattere diverso da una parola (o un carattere di parola e l'inizio o la fine del testo di input). La definizione di cosa costituisce un carattere di parola differisce tra le implementazioni regex, ma spesso è simile alla alla classe di caratteri [a-zA-Z0-9_]; controllare la documentazione di riferimento della lingua per i dettagli.

var results = '+8x2+10y2-99+5=99'.match(/\b[0-9]+\b/g); 
 

 
document.writeln('<pre>' + results.join(',') + '</pre>');

Questo produce il seguente output, che è molto vicino, ma non riesce a prendere il '-':

99,5,99 

Prossima fermata: ottenere il cruscotto. Questo è solo un singolo cambiamento di carattere, e aggiungiamo il carattere '-' alla fine della classe di caratteri [0-9]. Il '-' ha poteri speciali in una classe di caratteri, che richiede l'escape di '-' o l'uso della regola speciale che non ha poteri alla fine della classe di caratteri; Non mi piace scappare quando non devo, quindi alla fine va. Ora, per l'esempio:

var results = '+8x2+10y2-99+5=99'.match(/\b[0-9-]+\b/g); 
 

 
document.writeln('<pre>' + results.join(',') + '</pre>');

e viola! I risultati sono e sono buoni:

-99,5,99 

Tuttavia, possiamo migliorare su questa espressione regolare. Il primo miglioramento consiste nell'utilizzare il metacarattere \d per sostituire l'intervallo 0-9 troppo lungo nella classe di caratteri. L'utilizzo di questa tecnica rappresenta un 33.333% di risparmio nei tasti digitati, e sarà impressionare i vostri amici, colleghi e secchioni regex ovunque:

var results = '+8x2+10y2-99+5=99'.match(/\b[\d-]+\b/g); 
 

 
document.writeln('<pre>' + results.join(',') + '</pre>');

Stavo solo controllando, e sì, abbiamo gli stessi risultati:

-99,5,99 

Infine, risolveremo un piccolo problema che abbiamo creato quando abbiamo aggiunto il supporto "-" un paio di passaggi indietro. Il problema è che questo approccio può effettivamente portare a risultati di corrispondenza falsi (o impropri).

Ad esempio, quando l'input contiene un numero valido meno un altro numero valido, le soluzioni precedenti le restituirebbero entrambe come un unico risultato. Lo testeremo e quindi separeremo '-' per essere abbinati solo come prefisso a un numero valido. Per verificare ciò, è necessario modificare leggermente l'input (modificare "10y2" a solo "10") e verificare le soluzioni precedenti ("cattive") e nuove ("buone"):

var text = '+8x2+10-99+5=99'; 
 

 
var bad_results = text.match(/\b[\d-]+\b/g); 
 
var good_results = text.match(/\b-?\d+\b/g); 
 

 
document.writeln('<pre> Bad: ' + bad_results.join(',') + '</pre>'); 
 
document.writeln('<pre> Good: ' + good_results.join(',') + '</pre>');

Il risultato di questo è:

Bad: 10-99,5,99 
Good: 10,-99,5,99 

Chiaramente, questo è un approccio migliore. E con questo, abbiamo la nostra soluzione finale. Sii bene e regex con saggezza!

+0

Questa è un'ottima risposta! – Feathercrown

+0

Provo a dare il merito dove è dovuto;) – Feathercrown

8

È possibile utilizzare un trattino opzionale e word boundaries per abbinare solo numeri da determinati espressioni:

var str = '+8x2+10y2-99+5=99'; 
 

 
var matches = str.match(/-?\b\d+\b/g); 
 

 
document.writeln('<pre>' + matches.join(',') + '</pre>');

uscita:

-99,5,99 

RegEx Demo

+0

@Prasad: Posso sapere perché hai rimosso il segno di accettazione dalla mia risposta? – anubhava