Michel Perfetti
Les expressions régulières
Cet article est une introduction aux expressions régulières et à leur utilisation dans la validation de données
Par Michel Perfetti publié le 07/01/2008 à 06:45, lu 6172 fois, 4 pages
 3 | Validation des entrées utilisateurs
La validation en Windows Forms est réalisée grâce à un ensemble d'évènements sur les contrôles graphiques :
  • « Validating » pour la validation en elle-même
  • « Validated » pour effectuer des opérations une fois la validation effectuée
Concentrons-nous sur l'évènement « Validating ». C'est dans cet évènement que nous allons brancher notre expression régulière. Elle sera combinée avec le composant ErrorProvider qui va nous permettre d'informer l'utilisateur de son erreur de saisie. ErrorProvider va afficher à coté du contrôle une icône indiquant une erreur. La classe de type «CancelEventArgs » passée en paramètre de l'évènement contient une propriété Cancel qui permet d'indiquer que la validation a échouée :

private const string PATTERN = @"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*";

private void textBox1_Validating(object sender, CancelEventArgs e)

{

    e.Cancel = !Regex.IsMatch(textBox1.Text,PATTERN);

    if (e.Cancel)

    {

        errorProvider1.SetError(textBox1, "l'e-mail n'est pas valide");

    }

    else

    {

        errorProvider1.SetError(textBox1,String.Empty);

    }

}

Le résultat est le suivant :
 
Validation en Windows Forms

Validation en Windows Forms

 
La technologie ASP.Net possède un avantage par rapport à la technologie windows forms : il existe en standard des validateurs pour toute sorte d'entrées :
  • RequiredStringValidator
  • RangeValidator
  • RegularExpressionValidator (c'est celui-ci qui nous intéresse)
  • CompareValidator
  • CustorValidator
Attachons simplement un RegularExpressionValidator à un champ texte :

<div>

    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

    <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="TextBox1"

        ErrorMessage="Email not valide" 

        ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"></asp:RegularExpressionValidator>

</div>

La validation est réalisée à deux moments :
  • Coté client pour plus d'interactivité avec l'utilisateur,
  • Coté serveur pour valider que les données sont bien conformes.
La deuxième étape est facultative, mais elle est absolument essentielle pour valider les données, rien ne garantit que les données ont bien été validées coté client. Cette validation peut être réalisée validateur par validateur en appelant la méthode « Validate » de chaque validateur puis tester sa propriété IsValid :

RegularExpressionValidator1.Validate();

bool isValid = RegularExpressionValidator1.IsValid;

ou faire la même manipulation sur la page elle-même :

Page.Validate();

Page.IsValid;

Au moment de la saisie, si les données ne sont pas valides, un message apparait :
 
Validation en ASP.Net

Validation en ASP.Net

 
L'une des façons de réaliser des validations d'entrées utilisateurs en WPF est l'implémentation de « Validation Rules ». Il suffit hériter de la classe « System.Windows.Control.ValidationRules » :

internal class RegexValidationRule: ValidationRule

{

    private string _pattern;

 

    public override ValidationResult Validate( object value,

                                               System.Globalization.CultureInfo cultureInfo)

    {

        string strValue = value as string;

 

        if (strValue == null)

        {

            return new ValidationResult(false, null);

        }

 

        try

        {

            Regex regex = new Regex(_pattern);

            bool match = regex.IsMatch(strValue);

            return new ValidationResult(match, false);

        }

        catch

        {

            return new ValidationResult(false, null);

        }

    }

 

 

    public string Pattern

    {

        get

        {

            return _pattern;

        }

        set

        {

            _pattern = value;

        }

    }

}

La propriété Pattern est remplie lors de la déclaration de notre règle de validation directement en xaml :

<TextBox Height="21" Margin="106,0,145.25,94" Name="tbEmail" VerticalAlignment="Bottom" 

        Canvas.Left="59" Canvas.Top="96" Width="226">

    <TextBox.Text>

        <Binding Path="Email">

            <Binding.ValidationRules>

                <validators:RegexValidationRule Pattern="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"/>

            </Binding.ValidationRules>

        </Binding>

    </TextBox.Text>

    <Validation.ErrorTemplate>

        <ControlTemplate>

 

            <Border BorderBrush="Red" BorderThickness="3">

                <AdornedElementPlaceholder />

            </Border>

        </ControlTemplate>

 

    </Validation.ErrorTemplate>

</TextBox>

Dans cet exemple, une bordure rouge est ajoutée sur notre champ lorsqu'il n'est pas valide :
 
Validation en WPF

Validation en WPF

 
 
» Démarrer une discussion