【问题标题】:Regex for a custom validation in ruby用于 ruby​​ 中的自定义验证的正则表达式
【发布时间】:2014-04-02 04:14:30
【问题描述】:

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

我的要求:

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

  2. 应该以字母或数字或特殊字符开头# OR *

  3. 应该以字母或数字或特殊字符结尾.)

  4. 不应允许连续的特殊字符

  5. 它应该检查任何开始的括号'(',有一个结束括号')'

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

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

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

但是,对于上面的表达式,

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

谁能帮帮我。

【问题讨论】:

  • @sawa: "?',?[]}{=-)(*&^%$#`~{}" 这些是特殊字符,我已经给出了所有 sp。我想允许的字符。希望你清楚。
  • “有问题”是什么意思?什么具体不起作用?你能举出反例,在不应该通过的地方通过,或者在应该正确的地方失败吗?没有它,这是一个懒惰的问题,将大量工作倾倒给其他人。你应该让你的问题尽可能容易理解和回答。见这里:stackoverflow.com/help/how-to-ask
  • @Amadan:我已经解释了这些问题。请检查
  • 是否可以进行多个测试和正则表达式?如果您不尝试将所有需求压缩到一个复杂的正则表达式中,这个问题会容易得多。例如,/\A.{1,25}\z/ 应用长度限制,但没有其他限制。
  • @RajeshCO:我认为你可以很容易地组合项目 1..3,但其余的独立得多。

标签: jquery ruby-on-rails ruby regex


【解决方案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 就足够了。

【讨论】:

    猜你喜欢
    • 2011-12-02
    • 2011-09-07
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 2019-05-19
    • 2018-06-16
    相关资源
    最近更新 更多