Regex MVC在使用电话号码的正则表达式验证输入时引发解析错误

Regex MVC在使用电话号码的正则表达式验证输入时引发解析错误,regex,asp.net-mvc-3,Regex,Asp.net Mvc 3,我使用^[0-9()-]+$作为正则表达式来验证电话号码。 基本上,我只允许数字、hypen和两个大括号,即() 我在模型级属性(MVC3.0中)中添加了这一点。 在给出一个有效字符串(比如5299912548)后,它将被接受,但在视图中,它的抛出错误为“解析”^[0-9()-]+$”-[x-y]范围,顺序相反。” 使用的正则表达式中是否存在问题,或者其他MVC3内容是否存在问题 ^[0-9()\- ]+$ 您需要转义连字符-否则它是一个范围指示器 您也可以这样做: ^[0-9() -]+$

我使用
^[0-9()-]+$
作为正则表达式来验证电话号码。 基本上,我只允许数字、hypen和两个大括号,即()

我在模型级属性(MVC3.0中)中添加了这一点。 在给出一个有效字符串(比如5299912548)后,它将被接受,但在视图中,它的抛出错误为“解析”^[0-9()-]+$”-[x-y]范围,顺序相反。

使用的正则表达式中是否存在问题,或者其他MVC3内容是否存在问题

^[0-9()\- ]+$
您需要转义连字符-否则它是一个范围指示器

您也可以这样做:

^[0-9() -]+$
连字符和空格已切换。regex中的连字符位置以前一直困扰着我,在这种情况下,我有时需要调整位置

如果有人能告诉我为什么会这样,我将不胜感激

但这将解决这个问题

编辑:

研究揭示了答案。某些风格的正则表达式允许连字符是第一个或最后一个,并且仍然可以按字面解释

您需要转义连字符-否则它是一个范围指示器

您也可以这样做:

^[0-9() -]+$
连字符和空格已切换。regex中的连字符位置以前一直困扰着我,在这种情况下,我有时需要调整位置

如果有人能告诉我为什么会这样,我将不胜感激

但这将解决这个问题

编辑:


研究揭示了答案。某些风格的正则表达式允许连字符是第一个或最后一个,但仍然可以按字面解释。

这部分的问题在于:

[/-.] 
这意味着“从“/”到“.”的字符范围-但是在Unicode中“/”在“.”之后,所以这个范围没有意义

如果您想让它表示“斜杠、破折号或句号”,那么您需要:

[/\-.]
换言之,你需要逃离冲刺。请注意,如果这是在常规的C#字符串文字中,则还需要执行另一级别的转义:

string pattern = "[/\\-.]";
使用逐字字符串文字表示不需要转义反斜杠:

string pattern = @"[/\-.]";
或者,您可以将破折号放在开头:

[-/.]
或结束:

[/.-]

这部分的问题在于:

[/-.] 
这意味着“从“/”到“.”的字符范围-但是在Unicode中“/”在“.”之后,所以这个范围没有意义

如果您想让它表示“斜杠、破折号或句号”,那么您需要:

[/\-.]
换言之,你需要逃离冲刺。请注意,如果这是在常规的C#字符串文字中,则还需要执行另一级别的转义:

string pattern = "[/\\-.]";
使用逐字字符串文字表示不需要转义反斜杠:

string pattern = @"[/\-.]";
或者,您可以将破折号放在开头:

[-/.]
或结束:

[/.-]

检查这一项-[Regex Error:[x-y]范围的倒序][1][1]:注意,这也将允许
(1)(2)(3)(4)(5)(6)(7)(8)(9)(0)
,即使它按预期工作,也很难成为标准的电话号码格式。检查这一项-[Regex Error:[x-y]范围的倒序][1][1]:注意,这也将允许
(1)(2)(3)(4)(5)(6) (7)(8)(9)(0)
,几乎不是一种标准的电话号码格式,即使它按预期工作。我不认为这是问题所在,因为我有另一个regex作为^[a-zA-Z0-9-]+$用于允许字母、数字和hypen。但是在第二个正则表达式示例中,连字符前面没有右括号:)你试过了吗?@Biki,你的第二个表达式有效,因为范围0-9中的9是一个范围的结束,而该范围不能是新范围的开始,所以正则表达式解释器知道“-”不能属于某个范围,所以不会抛出错误。@HappyTimeGopher,让我试着启发你。连字符是正则表达式字符类中的一个特殊字符,因此基本上需要对其进行转义,以便与它进行逐字匹配。在很多地方,口译员都知道,它不可能是一个范围运算符,因此,它在没有转义的情况下被字面上接受。这是角色类的开始和结束,就像您在第二个解决方案中所做的那样。其他地方是那些直接在一个范围之后的地方,就像我在上面向比基解释的那样(但这些地方不应该被使用,因为它很刺激)。但总是逃避并没有什么坏处。我不认为这是问题所在,因为我有另一个正则表达式作为^[a-zA-Z0-9-]+$用于允许字母、数字和hypen。但是在第二个正则表达式示例中,连字符前面没有右括号:)你试过了吗?@Biki,你的第二个表达式有效,因为范围0-9中的9是一个范围的结束,而该范围不能是新范围的开始,所以正则表达式解释器知道“-”不能属于某个范围,所以不会抛出错误。@HappyTimeGopher,让我试着启发你。连字符是正则表达式字符类中的一个特殊字符,因此基本上需要对其进行转义,以便与它进行逐字匹配。在很多地方,口译员都知道,它不可能是一个范围运算符,因此,它在没有转义的情况下被字面上接受。这是角色类的开始和结束,就像您在第二个解决方案中所做的那样。其他地方是那些直接在一个范围之后的地方,就像我在上面向比基解释的那样(但这些地方不应该被使用,因为它很刺激)。但总是逃避并没有伤害。