0

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

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

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

它的意思是:

“这是一个测试”> TRUE

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

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

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

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

"this is a test test.com this 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
4

1 回答 1

1

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

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

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

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

于 2012-11-18T21:53:11.097 回答