用AND运算符在ruby中的正则表达式

时间:2012-11-18 21:31:46

标签: ruby regex

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

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

这意味着像“你在www.test.com”这样的字符串是假的 但现在我想要一个URL:www.example.com。

这意味着:

“这是一个测试”> TRUE

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

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

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

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

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

似乎我需要包含一个AND运算符,我认为它是:

(?=.*PATTERN)

但不幸的是我无法使其发挥作用。

ps:我知道这个检测网址的正则表达式并不完美,但因为我的要求它比任何东西都要好。

谢谢!

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

目前尚不清楚你在这里做了什么,但这似乎是一组极其严格的顶级域名。可能需要处理数千个valid TLDs