正则表达式不起作用。出现堆栈溢出错误



我在网络上找到了这种模式,除了这种模式外,我还测试了几次,它们都失败了,但它们仅在成功中失败。

public string Address { 
        get 
        {
            return this.Address;
        } 
        private set
        {
            string emailPattern = @"^[w!#$%&'*+-/=?^_`{|}~]+(.[w!#$%&'*+-/=?^_`{|}~]+)*"
                                + "@"
                                + @"((([-w]+.)+[a-zA-Z]{2,4}))"
                                + "|"
                                + @"(([0-9]{1,3}.){3}[0-9]{1,3}))z";
            if (Regex.IsMatch(value, emailPattern))
            {
                this.Address = value;
            }
            else
            {
                throw new Exception(value + " doesn't seem to be a valid email address.");
            }
        }

问题不在正则表达式的模式中,这是,如果将正则匹配您在无限循环中称为固定器。您只需致电您的Getter就会遇到相同的问题。而是使用背景字段来避免这种情况。

private string _address;
public string Address 
{ 
    get 
    {
        return _address; 
    } 
    private set
    {
        string emailPattern = @"^[w!#$%&'*+-/=?^_`{|}~]+(.[w!#$%&'*+-/=?^_`{|}~]+)*"
                            + "@"
                            + @"((([-w]+.)+[a-zA-Z]{2,4}))"
                            + "|"
                            + @"(([0-9]{1,3}.){3}[0-9]{1,3}))z";
        if (Regex.IsMatch(value, emailPattern))
        {
            _address = value;
        }
        else
        {
            throw new Exception(value + " doesn't seem to be a valid email address.");
        }
    }
}

在调试器中逐步浏览您的代码会清楚地显示出该问题。

在此行中,您可以调用设置方法并输入无限循环:

this.Address = value;

您需要在私人属性中设置:

private string _address = string.empty
public string Address { 
        get 
        {
            return _address;
        } 
        private set
        {
            string emailPattern = @"^[w!#$%&'*+-/=?^_`{|}~]+(.[w!#$%&'*+-/=?^_`{|}~]+)*"
                                + "@"
                                + @"((([-w]+.)+[a-zA-Z]{2,4}))"
                                + "|"
                                + @"(([0-9]{1,3}.){3}[0-9]{1,3}))z";
            if (Regex.IsMatch(value, emailPattern))
            {
                _address = value;
            }
            else
            {
                throw new Exception(value + " doesn't seem to be a valid email address.");
            }
        }

vache与无限循环合适,并正确地包含了该属性的背景字段。

作为一般规则,尤其是在使用MVVM之类的模式时,您的设定器应检查一个值更改以避免无限循环。Microsoft文档中使用的一个示例是在BindableBase中。

,例如

if(_address != value)
  _address = value;

或:

if(_address == value)
  return;
_address = value;

最新更新