2010-07-15 6 views
0

Je développe une application WPF (.NET 3.5) où je dois valider un textbox avec un regular expression pour correspondre zone de texte vide ou texte comme 02145 ou 05145 ou 02145, 05879, 02445. l'expression que j'utilise est ^(0(2|5)[0-9]{3})?((,0(2|5)[0-9]{3})*?)$.Comment écrire un nombres séparés par des virgules validation d'expression régulière pour textbox WPF

Cela fonctionne presque juste que je ne vais pas me laisser avoir une zone de texte vide. voici un code

<Window.Resources> 
    <data:Message x:Key="message"/> 
    <Style x:Key="validButton" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}" > 
     <Setter Property="IsEnabled" Value="False"/> 
     <Style.Triggers> 
      <MultiDataTrigger> 
       <MultiDataTrigger.Conditions> 
        <!-- ......--> 
        <Condition Binding="{Binding ElementName=txtNumbers, Path=(Validation.HasError)}" Value="false"/> 
       </MultiDataTrigger.Conditions> 
       <Setter Property="IsEnabled" Value="True" /> 
      </MultiDataTrigger> 
     </Style.Triggers> 
    </Style> 

<TextBox Height="23" Margin="-194.5,-88,-195.5,0" Name="txtNumbers" VerticalAlignment="Top" Style="{StaticResource txtboxerrors}"> 
         <TextBox.Text> 
          <Binding Path="Numbers" Source="{StaticResource message}" ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged"> 
           <Binding.ValidationRules> 
            <ExceptionValidationRule /> 
           </Binding.ValidationRules> 
          </Binding> 
         </TextBox.Text> 
</TextBox> 
<Button Height="23" Margin="0,0,-81,-189" Name="btnSendSMS" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="75" Click="btnSubmit_Click" Style="{StaticResource validButton}">Submit</Button> 

et la classe utilisée pour la validation est inférieure

class Message :IDataErrorInfo 
{ 
    //... 
    private string numbers; 



    public string this[string columnName] 
    { 
     get 
     { 
      string result = null; 
      //..... 
      if (columnName == "Numbers") 
      { 
//multicellRegex has the ^(0(2|5)[0-9]{3})?((,0(2|5)[0-9]{3})*?)$ expression     if(!Util.ValidateRegexPatern(Properties.Resources.multicellRegex,this.numbers)) 
       { 
        result = "Number not in the correct format.try 020xx or 05xxx,026xx"; 
       } 
      } 


      return result; 
     } 
    } 

    public string Error 
    { 
     get { return null; } 
    } 

    //..... 
     public string Numbers 
     { 
      get { return numbers; } 
      set { numbers = value; } 
     } 


} 

cela fonctionne bien mais le bouton d'envoi ne sera pas actif à moins de type i un ou plusieurs numéros dans la zone de texte de txtNumbers. Je veux juste qu'il autorise la boîte de texte vide. Comment devrais-je y parvenir? Merci d'avoir lu

Répondre

2

Vous devriez faire l'ensemble du modèle en option, et non les parties séparées, ou il pensera que ,02000 est une entrée valide .

Comme chaque nombre a une longueur spécifique, vous n'avez pas besoin de rendre la correspondance non gourmande (en utilisant *?).

^((0[25]\d{3})(,0[25]\d{3})*)?$. 

En tenant compte des espaces autour des numéros serait:

^\s*((0[25]\d{3})(\s*,\s*0[25]\d{3})*)?\s*$. 
+0

Bonjour merci pour le conseil '^ (\ s * (0 [25] \ d {3})? ((, 0 [25] \ d {3}) *?) \ S *)? $' Ou '^ (\ s * (0 (2 | 5) [0-9] {8})? ((, 0 (2 | 5) [0-9] {8}) *?) \ s *)? $ 'fonctionne mais c'est légèrement différent de votre suggestion. merci –

+0

Je vois, vous voulez également autoriser les espaces. J'ai ajouté cela à la réponse. Vos deux modèles contiennent toujours '*?' Pour faire une correspondance non gourmande, ce qui est inutile lorsque vous faites correspondre un nombre de taille fixe. – Guffa

1

La regex est bien et fait ce que vous voulez. Votre zone de texte contient peut-être des espaces parasites?

Essayez l'encapsulation des espaces parasites au début et à la fin, ce qui est plus robuste de toute façon:

^\s*(0(2|5)[0-9]{3})?((,0(2|5)[0-9]{3})*?)\s*$ 
0

Sous votre modèle de vue, juste définir Numbers =string.Empty lorsque le modèle de vue commence le chargement, donc par la notification de changement, votre logique devrait être appliquée et vous obtiendrez l'effet que vous voulez.

Cheers.

Questions connexes