2015-05-08 22 views
6

Ho un'espressione regolare che funziona su regexplib.com quando lo collaudo con il motore .NET. Non trova una corrispondenza con JavaScript. Ho anche provato JSFiddle con il codice qui sotto. Non trova una corrispondenza. Restituisce nulla.espressione regolare non funziona con javascript

var re = RegExp('^\d+(?:\.\d{0,1})?$'); 
var myString = "123"; 
alert(myString.match(re)); 

Sto cercando di utilizzare il seguente javascript in una pagina Web di aspx. Non trova corrispondenze. Sono aperto alle idee.

function ValidateData(ControlObj, ColumnType) { 
var re = new RegExp('^\d+(?:\.\d{0,1})?$'); 

if (!ControlObj.value.match(re)) { 

risposta

8

Migliore utilizzo regex letterale al posto di oggetto regex:

var re = /^\d+(?:\.\d?)?$/; 
var myString = "123"; 
alert(myString.match(re)); 

meno fino a quando si sta costruendo un'espressione regolare in modo dinamico non v'è alcuna necessità di utilizzare RegExp oggetto.

Altrimenti RegExp oggetto dovesse escape doppio come:

var re = RegExp('^\\d+(?:\\.\\d?)?$'); 

Motivo per letto escape è che RegExp oggetto prende una stringa come input e escape è necessario prima di stringa e il secondo per il motore regex.

btw \d{0,1} possono essere sostituiti da \d?

+1

Si prega di spiegare il motivo per cui il doppio-fuga è necessaria. In caso contrario, lo aggiungerò più tardi. – RudePeopleStepOff

+1

Grazie per il commento, ho aggiunto qualche spiegazione. – anubhava

+1

Non è vero che * \ d {0,1} può essere sostituito da \ d **. '\ d {0,1}' è uguale a '\ d?' come '?' significa "0 o 1, goloso". Vedi il mio post. –

3

Usa doppia sfuggito barre:

var re = RegExp('^\\d+(?:\\.\\d{0,1})?$'); 

e dovrebbe funzionare.

In JavaScript, è possibile utilizzare la notazione letterale e un costruttore. Nella notazione letterale (vedi il suggerimento di anubhava), è necessario aggiungere / ... / e quindi non è necessario sfuggire alle barre. Quando si utilizza un oggetto RegExp (un costruttore), è necessario evitare i backslash.

Il costruttore è utile quando è necessario passare variabili al modello. In altri casi, è preferibile una notazione letterale.

var re = /^\d+(?:\.\d?)?$/; 

\d{0,1} è lo stesso come \d?? significa 0 or 1, greedy.

Vedere more about that difference on MDN.

La notazione letterale fornisce la compilazione dell'espressione regolare quando l'espressione viene valutata. Utilizzare la notazione letterale quando l'espressione regolare rimarrà costante. Ad esempio, se si utilizza la notazione letterale per costruire un'espressione regolare utilizzata in un ciclo, l'espressione regolare non verrà ricompilata in ogni iterazione.

Il costruttore dell'oggetto espressione regolare, ad esempio, nuovo RegExp ('ab + c'), fornisce la compilazione di runtime dell'espressione regolare . Usa la funzione di costruzione quando sai che il normale pattern di espressione cambierà, o non conosci il pattern e lo ricevi da un'altra fonte, come l'input dell'utente.

Quando si utilizza la funzione di costruzione, le normali regole di escape delle stringhe (caratteri speciali precedenti con \ se inclusi in una stringa) sono necessarie.

Problemi correlati