【问题标题】:Regex in ruby with AND operator带有AND运算符的红宝石正则表达式
【发布时间】:2012-11-06 20:15:44
【问题描述】:

我有一个正则表达式可以检测字符串何时不是给定的模式:

/\A((?!.*(www|http|@|\.com\b|\.net\b|\.de\b|\.info\b)).*)$/m

这意味着像“hi you at www.test.com”这样的字符串是 FALSE 但现在我想允许一个 URL:www.example.com。

意思是:

“这是一个测试”> 是的

“这是一个测试www.example.com” > TRUE

“这是一个测试example.com这个”> TRUE

“这是一个测试www.test.com这个” > FALSE

“这是一个测试 test.com this” > FALSE

“这是一个测试 test.com 这个 www.example.com ” > FALSE(错误,因为存在一个禁止的 URL)

看来我需要包含一个 AND 运算符,我认为是:

(?=.*PATTERN)

但不幸的是我无法让它工作。

ps:我知道这个检测url的正则表达式一点也不完美,但是因为我的要求,总比没有好。

谢谢!

编辑: 我的正则表达式位于验证器中:

def self.validates_is_url_and_email_free(*attr_name)
    validates_format_of attr_name, {:with => /\A((?!.*(www|http|@|\.com\b|\.net\b|\.de\b|\.info\b)).*)$/m, :message => I18n.t(:not_url_email)}
end

【问题讨论】:

  • 这场比赛你在做什么?为什么不提取 URI 然后对其进行二次操作呢? gsubscan 可能会有所帮助。当你想要一个肯定的时候,你使用否定断言?! 似乎很奇怪。
  • What's a good way to validate links (urls) in rails 3? 的可能副本——那里有一些不涉及 Rails 的好主意。

标签: ruby regex


【解决方案1】:

在这种情况下,使用两个单独的表达式可能是解决方案:

OKAY_EXPR = /example\.com/
BANNED_EXPR = /.../ # Existing expression

if (string.match(OKAY_EXPR) and !string.match(BANNED_EXPR))
  # ...
end

不清楚您在这里做什么,但这似乎是一组极其严格的 TLD。实际上有数千个valid TLDs 可能需要处理。

【讨论】:

  • 我在编辑部分添加了更多细节,如果可能的话,我不知道如何将您的代码放在我的:with 中。谢谢!
  • 这是一个 Rails 2.x 风格的验证。 Rails 3 有一个新的语法:validates ..., :format => { :with => /.../ } 来做到这一点。在任何情况下,您始终可以编写自己的验证例程来执行您想要的任何操作,而不必编写一个非常复杂的正则表达式来一次性完成所有操作。可以用一些棘手的前瞻性否定断言来表达它,但它最终会成为几乎无法阅读的行噪音。
  • 是的,我使用的是 rails 2。你能给我举个例子,这个验证程序有多白吗?
  • validate :method_name 将在验证期间触发对method_name 的调用。然后,您的方法可以进行所需的任何测试,使用errors.add 注入任何错误,如果失败,则返回false 以停止保存链。 the documentation 中的更多示例。
猜你喜欢
  • 2022-06-23
  • 2016-12-14
  • 2019-04-22
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多