正则表达式在ruby中进行自定义验证

时间:2014-04-02 04:14:30

标签: jquery ruby-on-rails ruby regex

请参阅我的Ruby on Rails应用程序中的Regex表达式,用于使用jQuery Validation Engine完成验证。所以,我需要一个自定义需求的正则表达式,

我的要求:

  1. 它应该只包含字母,数字,特殊字符#, _, -, (, ), ., *和空格。

  2. 应以字母或数字或特殊字符#*

  3. 开头
  4. 应以字母或数字或特殊字符.)

  5. 结尾
  6. 不应允许连续的特殊字符

  7. 它应检查是否有任何起始括号'(',有一个右括号')

  8. 应将整个字符长度限制为25

  9. 我在rubular.com中尝试了以下表达式:

    /^([a-zA-Z]|\d|\#|\*)(([a-zA-Z]*\d*\(?\)?\-?\.?)*)([a-zA-Z]|\d|\)|\.)$/
    

    但是,对于上面的表达,

    它允许'*)', '()','*.'等组合。特殊字符之间至少应有一个字符或数字。此外,即使我们输入'(',现在也不会检查起始括号')'。所以,这些都是问题。

    任何人都可以帮助我。

1 个答案:

答案 0 :(得分:1)

可能可以将所有规则编码为单个正则表达式,但是起始字符,连续字符,成对括号和总长度的规则将组合成一个非常难以实现的规则代码和难以阅读的正则表达式(您的需求的总体复杂性正在接近基于语法的解决方案的需求 - 例如解析器)。

我建议编写多个验证测试,其中一些是基于正则表达式,并按顺序测试它们。

您可以从您的项目1..3(字符串的开头,中间,结尾处允许的字符)开始,这是您当前的解决方案非常接近的。我更喜欢这里的字符类,注意这个正则表达式假设字符串总是至少2个字符,除了列出的规则:

/\A[a-zA-Z0-9\#\*][a-zA-Z0-9\#\*\.\(\)\s\-_]*[a-zA-Z0-9\.\)]\z/

我更喜欢\A表示字符串的开头而\z表示结束,但^$可能适合您使用。

以下正则表达式会找到连续的特殊字符(您的规则4),因此您必须将其否定(使用!~而不是=~进行测试)

/[\#\*\.\(\)\s\-_]{2}/

使用正则表达式检查配对括号(规则5)很难。相反,您应该检查任何开始或结束括号/[\(\)]/,如果有任何开放或结束括号,请检查它们是否与更多代码配对。请参阅提供算法的this answer to a similar requirement

最后,为了检查长度(规则6),你甚至不需要正则表达式。如果您的输入位于str,那么str.size <= 25就足够了。