2010-09-08 5 views
1

je le RegularExpressionValidator suivant sur une de mes pages:Validator lancer erreur

<asp:RegularExpressionValidator ID="RegularExpressionValidator2" runat="server" 
             ControlToValidate="InKindTextBox" 
             ErrorMessage="The value entered for 'Cash' must be in a number format. Examples: 500.00, 500, $500, $50,000 or $500.00" 
             ValidationExpression="(?n:(^\$?(?!0,?\d)\d{1,3}(?=(?<1>,)|(?<1>))(\k<1>\d{3})*(\.\d\d)?)$)" > 

Mais quand il tente de le valider jette l'erreur ci-dessous d'un de mes pages de JS dynamiques.

alt text

Quand je lance ce regex par regex texter il fonctionne très bien. Est-ce que je fais quelque chose de mal ici?

Répondre

2

JavaScript utilise une syntaxe regexp différente de .NET. Voir, par exemple, this page.

Citation de MSDN de RegularExpressionValidator page:

La validation régulière expression mise en œuvre est légèrement différent sur le client que sur le serveur. Sur le , la syntaxe du client, expression régulière JScript est utilisée. Sur le serveur, la syntaxe System.Text.RegularExpressions.Regex est utilisée. Depuis la syntaxe d'expression régulière JScript est un sous-ensemble de la syntaxe System.Text.RegularExpressions.Regex , il est recommandé de JScript syntaxe d'expression régulière est utilisée dans afin de donner les mêmes résultats sur le client et le serveur.

Mise à jour: Une comparaison approfondie des saveurs d'expression régulière dans de nombreuses langues, y compris peut être trouvée .NET et JavaScript here.

Mise à jour 2: Voici une expression rationnelle qui doit valider les entrées de devises en utilisant jScript regex conforme:

     <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" 
            ControlToValidate="CashTextBox" ValidationGroup="vld_Insert" 
            ErrorMessage="The value entered for 'Cash' must be in a number format. Examples: 5000, 5000.00, 5,000 or $5,000.00" 
            ValidationExpression="^\s*\$?\s*(?!\d{4,},)(\d|\d{1,3},(?=\d{3})(?!\d{4}))*(\.\d{1,2})?\s*$"> 
+0

hasard vous sauriez comment convertir mon regex à une expression régulière jScrpt? :) –

+0

Mis à jour avec un lien vers une page de comparaison - une bonne aide pour que votre expression rationnelle soit correctement traduite. En outre, vérifiez leurs outils regexp. Leur powergrep est une application très utile. –

3

Je pense que votre regex est trop compliqué de toute façon. J'utiliser quelque chose de simple comme

^[1-9]\d*(\.\d*)?$ 

qui dit non 0, le au moins un chiffre avant la virgule, et un point décimal optionnel suivi par un plus grand nombre.

Modifier

^\$?([1-9]\d?\d?((,\d{3})*|(\d{3})*)|0?)(\.\d*)?$ 

Pour le tester

var r = /^\$?([1-9]\d?\d?((,\d{3})*|(\d{3})*)|0?)(\.\d*)?$/; 
var shouldMatch = ["$30,000.00", "30,000.00", "9,000.00", "9000", "1", ".12"]; 
var shouldntMatch = ["30,000000.00", "1.00c", "19,00.00", "$30,00"]; 
function test1() { 
    for (var i in shouldMatch) { 
    if (!r.exec(shouldMatch[i])) { 
     alert(shouldMatch[i]); 
     return; 
    } 
    } 
} 
function test2() { 
    for (var i in shouldntMatch) { 
    if (r.exec(shouldntMatch[i])) { 
     alert(shouldntMatch[i]); 
     return; 
    } 
    } 
} 
test1(); 
test2(); 
+0

Je souhaite accepter les entrées avec des signes dollar et des virgules. Le tien est trop simple. –

+0

Dans ce cas, vous voudrez changer le message d'erreur. Si vous décrivez le format que vous visez un peu mieux, nous pouvons le comprendre. –

+0

Message d'erreur modifié à votre demande. Je veux accepter une entrée américaine valide avec des signes dollar et des virgules aux bons endroits. 3 000 $ = valide.$ 30,00 = invalide –