Как написать проверку правильности регулярных выражений с разделенными запятыми числами для текстового поля wpf - PullRequest
0 голосов
/ 15 июля 2010

Я занимаюсь разработкой приложения WPF (.NET 3.5), в котором мне нужно проверить textbox с regular expression для соответствия пустому текстовому полю или тексту, например 02145 или 05145 или 02145, 05879, 02445. Я использую выражение ^(0(2|5)[0-9]{3})?((,0(2|5)[0-9]{3})*?)$.

Это почти работает только потому, что я не дам пустое текстовое поле. вот код

<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>

И класс, используемый для проверки, ниже

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; }
        }


}

это работает хорошо, но тогда кнопка отправки не будет активной, если я не введу одно или несколько чисел в текстовое поле txtNumbers. Я просто хочу, чтобы оно разрешило пустое текстовое поле. Как мне этого добиться? Спасибо за чтение

Ответы [ 3 ]

2 голосов
/ 15 июля 2010

Вы должны сделать необязательным весь шаблон, а не отдельные части, иначе будет думать, что ,02000 является действительной записью.

Поскольку каждое число имеет определенную длину, вам не нужно делать совпадение не жадным (используйте *?).

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

Разрешение для пробелов вокруг чисел будет:

^\s*((0[25]\d{3})(\s*,\s*0[25]\d{3})*)?\s*$.
1 голос
/ 15 июля 2010

регулярное выражение в порядке и делает то, что вы хотите.Возможно, в вашем текстовом поле есть пробельные пробелы?

Попробуйте инкапсулировать пробельные пробелы в начале и в конце, что в любом случае более надежно:

^\s*(0(2|5)[0-9]{3})?((,0(2|5)[0-9]{3})*?)\s*$
0 голосов
/ 15 июля 2010

В вашей модели представления просто установите Numbers =string.Empty, когда модель представления начнет загружаться, поэтому через уведомление об изменении необходимо применить вашу логику, и вы получите желаемый эффект.

Приветствие.

...