2012-01-30 20 views
12

Ho un modello di espressione regolare, che convalida per un numero a tre cifreJavascript RegEx corrispondenza parziale

/^\d{3}$/.test("123") // true 
/^\d{3}$/.test("123.") // false 

voglio usare questa espressione regolare come una restrizione di ingresso su una casella di testo.

Fondamentalmente, se il nuovo valore corrisponde, autorizzo il carattere digitandolo, altrimenti lo prevengo.

Il problema è che nessun valore corrisponderà mai, perché "1" non è una corrispondenza completa e non mi consente di digitarlo.

È un modo per testare una corrispondenza parziale per un regEx in javascript?

/^\d{3}$/.test("123") // true 
/^\d{3}$/.test("12") // "partial match" 
/^\d{3}$/.test("a12") // false 

EDIT

\ d {3} era solo un esempio. Ho bisogno di usare una regex di posta elettronica o un telefono regex come limitazione di input.

"email"  // true 
"[email protected]"  // true 
"[email protected]@"  // false 
"@yahoo.com" // false 

EDIT 2

Ho un plugin di casella di testo con limitazione di ingresso basata su un'espressione regolare.

L'espressione regolare può essere qualsiasi cosa, un colore esadecimale Regex, ad esempio: (#) {1} ([a-FA-F0-9]) {6}

ho necessità di impedire all'utente di inserire caratteri che non corrispondono alla regex.

Ad esempio, se la casella di testo è vuota, il primo carattere consentito sarà "#".

Ma se provo il carattere "#" contro la regex, restituirà "false", perché "#" da solo non è valido.

/^(#){1}([a-fA-F0-9]){6}$/.test("#") // false 

Ma, allo stesso tempo, "#" è parziale valida perché rispetta il formato regex (e dovrei permettere all'utente di digitare esso)

cosa ho bisogno di sapere è se posso verificare se una stringa è una corrispondenza parziale di un'espressione regolare, quindi posso consentire all'utente di digitare il carattere.

/^(#){1}([a-fA-F0-9]){6}$/.test("#")  // is a partial match, allow type 
/^(#){1}([a-fA-F0-9]){6}$/.test("#0")  // is a partial match, allow type 
/^(#){1}([a-fA-F0-9]){6}$/.test("#00")  // is a partial match, allow type 
/^(#){1}([a-fA-F0-9]){6}$/.test("#000")  // is a partial match, allow type 
/^(#){1}([a-fA-F0-9]){6}$/.test("#0000") // is a partial match, allow type 
/^(#){1}([a-fA-F0-9]){6}$/.test("#00000") // is a partial match, allow type 
/^(#){1}([a-fA-F0-9]){6}$/.test("#000000") // is a partial match, allow type 
/^(#){1}([a-fA-F0-9]){6}$/.test("#000000D") // is not a match, prevent typing 
+0

Hai una risposta alle tue domande? – user153

+0

No, nessuna risposta – Catalin

+0

Ho riscontrato problemi simili :) – user153

risposta

0

È possibile specificare un intervallo nell'espressione in modo che corrisponda nulla tra uno e tre cifre in questo modo:

/^\d{1,3}$/.test("1") // true 
/^\d{1,3}$/.test("12") // true 
/^\d{1,3}$/.test("123a") // false 
+0

L'espressione regolare che ho usato solo come esempio. Normalmente userò una regex email o una regex del telefono, e dovrei consentire all'utente di digitare "email @" ma non gli permetta di digitare "email @@" ad esempio. – Catalin

0

Basta fornire un'espressione regolare che consente corrispondenze parziali. per esempio. /^\d{1,3}$/

1

Sarebbe meglio usare una libreria come maskedinput.js. È quindi possibile l'installazione inserire il testo come segue:

jQuery(function($){ 
    $("#your_input").mask("999"); 
}); 

UPDATE

è possibile utilizzare un validator per forme e tipi specifici predefiniti di campi per convalidare

+0

Il plugin di input mascherato jQuery viene utilizzato per stringhe di dimensioni fisse. Ho bisogno di qualcosa di generico. – Catalin

+0

@RaraituL, vedere l'aggiornamento – epoch

+0

Sì, ma è qualcosa di diverso. Ho bisogno di "validare" su keypress non su blur. – Catalin

0

Secondo l'ultima modifica, questo dovrebbe funzionare:

/^#[a-fA-F0-9]{0,6}$/ 
+0

Sì, ma questo è ancora hard coded Ho bisogno di una risposta "è una corrispondenza parziale" da un test regex. viene usata un'espressione regolare Qualcosa come questo [RegExPlus] (http://codesaway.info/RegExPlus/partial.html) che è per Java. – Catalin

+0

@RaraituL: Vedi la mia modifica, è questo che vuoi? – Toto

+0

Convalida, ma è ancora hard coded Dovrei essere in grado di avere qualsiasi espressione regolare, non solo il caso email.Ad esempio, potrei voler avere /^[aZ]{5}@?$/.test("email ") // true e /^[aZ]{5}@?$/.test("email2 ") // false – Catalin

1

Si potrebbe parzialmente validat e l'indirizzo email usando ()? per più lettere e/o caratteri. Ogni ()? va più in profondità nell'albero di convalida.

Il seguente schema di espressioni regolari convalida l'indirizzo di posta elettronica lettera per lettera.

^[a-zA-Z]+(@{1}[a-zA-Z]*(\.{1}[a-zA-Z]*)?)?$ 

Non prende in considerazione tutte le possibilità non mancano, ma per quelli di base come [email protected] funziona bene e non c'è spazio per migliorarlo ulteriormente.

0

Si desidera utilizzare esplicitamente "|" partite parziali. Per il vostro esempio di corrispondenza dei colori è abbastanza semplice, basta abbinare in modo esplicito una stringa vuota parziale

/^(|#[a-f0-9]{0,6})$/i.test(inputStr) 

Per una e-mail è più complicato dal momento che ci sono combinazioni di corrispondenza più parziali

/^(|\w+|\[email protected]|\[email protected]\w+|\[email protected]\w+\.|\[email protected]\w+\.\w+)$/.test(inputStr) 

noti che è possibile ottenere qualcosa come /^(|\w*@|...)$/ dato che corrisponde a @blah.com che non è un input parziale valido.