正则表达式无法正常工作。获得堆栈溢出错误

时间:2014-02-07 16:14:59

标签: c# regex

我在网上发现了这种模式,除了这种模式之外,我还测试了几种模式,但它们都失败了,但只有成功才会失败。

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.");
            }
        }

3 个答案:

答案 0 :(得分:6)

问题不在正则表达式的模式中,如果正则表达式匹配,则在无限循环中调用setter。只需调用你的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.");
        }
    }
}

在调试器中逐步执行代码会清楚地显示问题。

答案 1 :(得分:0)

在这一行中,您将调用set方法并进入无限循环:

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.");
            }
        }

答案 2 :(得分:0)

Vache右边有无限循环,并且在他的例子中正确包含了属性的支持字段。

作为一般规则,特别是如果使用MVVM等模式,您的setter应检查值更改以避免无限循环。 Microsoft文档中使用的示例位于BindableBase

e.g。

if(_address != value)
  _address = value;

或:

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