Domanda

Ho un campo in un modulo che assume i seguenti valori: -1, 2-10, 99

Ho una regola business che è interessato con le risposte 2-10.

Sto cercando di scrivere un espressione regolare che corrisponderà 2-10, ma non 99, e sto avendo problemi.

L'espressione originale:

^2|3|4|5|6|7|8|9|10$

Non riesce perché il 99 è abbinato (tecnicamente, due volte). Inoltre, i boundries Line sono una cosa che non sono mai stato a proprio agio. I oberve comportamento diverso da loro in espresso di me in altri luoghi (ad esempio .net). In questo caso particolare, l'espressione regolare viene eseguito in JavaScript . In ogni caso, espresso sembra ignorare loro (e se ho messo i valori tra parentesi:

^[2|3|4|5|6|7|8|9|10]$

^[2-9]$

sia "tutto spiegato" o come un intervallo, espresso non restituisce tutte le corrispondenze se a specificare i caratteri linea di apertura / linea di chiusura della stringa / stringa (e sì, stavo cercando di abbinare il 10 separatamente nel secondo caso) .

Lo so, lo so. Se si utilizza una regex per risolvere un problema, allora avete due problemi (e presumibilmente inizieranno invitare amici sopra, lo stile cosa 1 e cosa 2). Io non sono per utilizzare uno qui; Posso passare a un'istruzione case. Ma sembra come dovrei essere in grado di utilizzare una regex qui, e sembra una cosa ragionevole da fare. Sono ancora abbastanza verde quando si tratta di l'espressione regolare;

È stato utile?

Soluzione

È necessario parentesi per questo. Vorrei utilizzare ulteriormente gli intervalli per mantenere le cose leggibile:

^([2-9]|10)$

Altri suggerimenti

Si tratta chiaramente di un caso in cui non si dovrebbe usare RegExp ma valutazione numerica:

var num = parseInt(aNumber, 10);
if (num >= 2 && num <= 10) {
    alert("Match found!");
}

Utilizzare le parentesi intorno alle alternanze, dal momento che la concatenazione ha una precedenza maggiore di alternanza:

^(2|3|4|5|6|7|8|9|10)$

Una funzione javascript completa, per adattarsi sia però 2 9, o 10

<script type="text/javascript">
    function validateValue( theValue )
    {
        if( theValue.match( /^([2-9]{1}|10)$/ ) )
        {
            window.alert( 'Valid' );
        }
        else
        {
            window.alert( 'invalid' );
        }
        return false;
    }
</script>

L'espressione regolare è facilmente espandibile per incorporare tutte le regole:

/^(-1|[2-9]|10|99)$/ // will match -1, 2-10, 99

modifica: Ho dimenticato di dire si dovrà sostituire il proprio vero falso logica / situazionale. EDIT2:. aggiunto tra parentesi mancante al 2 regex

Il motivo per la vostra espressione originale non riesce è perché si sta corrispondenti ^ 2, 3, 4, 5, 6, 7, 8, 9, 10 $.

Prova questo regex: ^ (2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10) $

Questa utility on-line è molto bravo a generare re di per intervalli numerici: http://utilitymill.com/utility/ Regex_For_Range . Per la gamma 2-10 inclusiva, dà questa espressione: \b0*([2-9]|10)\b. Se si desidera escludere che porta 0 del, togliere la "0 *" parte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top