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?
risposta
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!
Questa è un'ottima risposta! – Feathercrown
Provo a dare il merito dove è dovuto;) – Feathercrown
È 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
@Prasad: Posso sapere perché hai rimosso il segno di accettazione dalla mia risposta? – anubhava
- 1. RegEx matcing valori numerici con o senza separatori delle migliaia
- 2. Intervallo di valori numerici validi
- 3. Rails 3 - Rendi campo di testo accetta solo valori numerici
- 4. Combinazione di valori hash MD5
- 5. Interrogare solo valori numerici il più presto possibile
- 6. SQL prendere solo i valori numerici da un varchar
- 7. controllare se un array contiene (solo valori numerici)
- 8. Verifica Se sono stati immessi solo valori numerici nell'input. (JQuery)
- 9. Limita l'input NSTextField a solo valori numerici? NSNumberformatter
- 10. Convertire caratteri numerici a caratteri alfabetici
- 11. Oggetto ruotato corrispondente a valori numerici
- 12. SQL Server: calcolo con valori letterali numerici
- 13. Albero decisionale ID3 con valori numerici
- 14. valori numerici Concatena in una stringa
- 15. Come contare il numero di valori numerici in una colonna
- 16. Estrai due doppi valori da String usando RegEx in Java
- 17. Operazioni matematiche su valori numerici preconfezionati
- 18. Ordina lista String con valori numerici
- 19. typeof() per verificare i valori numerici
- 20. Come formattare i valori numerici per la legenda di ggplot2?
- 21. bisogno di una regex per una stringa che deve avere valori numerici e lettera
- 22. consentendo solo alfanumerico valori
- 23. Java: la rimozione di valori numerici da stringa
- 24. Come quotare valori usando group_concat
- 25. Come trovare potenziali overflow numerici nel codice Java, usando Eclipse?
- 26. Estrazione dei valori numerici di un oggetto xts
- 27. laravel 4: facendo una combinazione di valori/colonne univoche
- 28. come convertire i valori numerici in nvarchar nel comando sql
- 29. Come aggiungere insieme valori numerici che sono memorizzati nelle stringhe?
- 30. Come posso ottenere valori numerici invece dei valori Logarthmic nella scala dell'asse D3?
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. –