char级的提前结束

时间:2014-03-12 05:18:30

标签: ruby-on-rails ruby regex ruby-on-rails-3

我有用于验证以下规则的电子邮件的正则表达式

电子邮件地址的本地部分可以使用以下任何ASCII字符:

Uppercase and lowercase English letters (a-z, A-Z)
Digits 0 to 9
Characters ! # $ % & ' * + - / = ? ^ _ ` { | } ~
Character . (dot, period, full stop) provided that it is not the first or last character, and provided also that it does not appear two or more times consecutively.

/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/i

它在Javascript中工作,但在Ruby http://rubular.com/中它给出错误&#34; char-class&#34;的过早结束。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

括号是正则表达式语法的一部分。如果要匹配文字括号(或任何其他特殊符号),请使用反斜杠进行转义。

这应该有效:

/^(([^<>()\[\]\\.,;:\s@\"]+(\.[^<>()\[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/i

答案 1 :(得分:1)

您应该转义符号范围内的方括号和结束:

#         ⇓                        ⇓
/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)…/

这应该是:

/^(([^<>()\[\]\\.,;:\s@\"]+(\.[^<>()\[\]\\.,;:\s@\"]+)*)…/

希望它有所帮助。

答案 2 :(得分:1)

irb(main):016:0> /[[e]/
SyntaxError: (irb):16: premature end of char-class: /[[e]/
        from /ms/dist/ruby/PROJ/core/2.0.0-p195/bin/irb:12:in `<main>'

在JavaScript正则表达式引擎中,您不需要在字符组[内转义[]。但是,您必须在Ruby正则表达式中使用\[

/^(([^<>()\[\]\\.,;:\s@\"]+(\.[^<>()\[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/i