Ruby 如何编写正则表达式以将.com或.org与“匹配”-&引用;在域名中

Ruby 如何编写正则表达式以将.com或.org与“匹配”-&引用;在域名中,ruby,regex,Ruby,Regex,如何在ruby中编写一个正则表达式来查找“-”和“.org”或“com”,如: 但不是: some-thing some-thing.moc 我写道:/.-.(org)?|。*(.com)/I 但它无法停止“some thing”或“some thing.moc”:(支持可选连字符 我可以用这个正则表达式: (https?:\/\/)?(www\.)?[a-z0-9-]+\.(com|org)(\.[a-z]{2,3})? (?:https?:\/\/)?(?:www\.)?[a-z0-9]

如何在ruby中编写一个正则表达式来查找“-”和“.org”或“com”,如:

但不是:

some-thing
some-thing.moc
我写道:/.-.(org)?|。*(.com)/I

但它无法停止“some thing”或“some thing.moc”:(

支持可选连字符 我可以用这个正则表达式:

(https?:\/\/)?(www\.)?[a-z0-9-]+\.(com|org)(\.[a-z]{2,3})?
(?:https?:\/\/)?(?:www\.)?[a-z0-9]+(?:[-][a-z0-9]+)+\.(?:com|org)(?:\.[a-z]{2,3})?

请记住,为了简单起见,我使用了捕获组,但如果您想避免捕获内容,可以使用以下非捕获组:

(?:https?:\/\/)?(?:www\.)?[a-z0-9-]+\.(?:com|org)(?:\.[a-z]{2,3})?
 ^--- Notice "?:" to use non capturing groups
def is_legit_url?(url)
   allowed_master_domains = %w{com org}
   allowed_country_domains = %w{sg it uk}
   url.match(/[^\/\:]+\.(#{allowed_master_domains.join '|'})(\.#{allowed_country_domains.join '|'})?/i) && true
end
此外,如果您不想使用协议和www模式,可以使用:

[a-z0-9-]+\.(?:com|org)(?:\.[a-z]{2,3})?
支持强制连字符 但是,正如在他的评论中指出的,如果您想确保至少有一个连字符,您可以使用以下正则表达式:

(https?:\/\/)?(www\.)?[a-z0-9-]+\.(com|org)(\.[a-z]{2,3})?
(?:https?:\/\/)?(?:www\.)?[a-z0-9]+(?:[-][a-z0-9]+)+\.(?:com|org)(?:\.[a-z]{2,3})?
尽管如此,这个正则表达式可能会出现可怕的回溯问题

支持可选连字符 我可以用这个正则表达式:

(https?:\/\/)?(www\.)?[a-z0-9-]+\.(com|org)(\.[a-z]{2,3})?
(?:https?:\/\/)?(?:www\.)?[a-z0-9]+(?:[-][a-z0-9]+)+\.(?:com|org)(?:\.[a-z]{2,3})?

请记住,为了简单起见,我使用了捕获组,但如果您想避免捕获内容,可以使用以下非捕获组:

(?:https?:\/\/)?(?:www\.)?[a-z0-9-]+\.(?:com|org)(?:\.[a-z]{2,3})?
 ^--- Notice "?:" to use non capturing groups
def is_legit_url?(url)
   allowed_master_domains = %w{com org}
   allowed_country_domains = %w{sg it uk}
   url.match(/[^\/\:]+\.(#{allowed_master_domains.join '|'})(\.#{allowed_country_domains.join '|'})?/i) && true
end
此外,如果您不想使用协议和www模式,可以使用:

[a-z0-9-]+\.(?:com|org)(?:\.[a-z]{2,3})?
支持强制连字符 但是,正如在他的评论中指出的,如果您想确保至少有一个连字符,您可以使用以下正则表达式:

(https?:\/\/)?(www\.)?[a-z0-9-]+\.(com|org)(\.[a-z]{2,3})?
(?:https?:\/\/)?(?:www\.)?[a-z0-9]+(?:[-][a-z0-9]+)+\.(?:com|org)(?:\.[a-z]{2,3})?
尽管如此,这个正则表达式可能会出现可怕的回溯问题

当然,根据您的规则是否宽松,可以简化上述内容。以下是一个更简单的模式,但允许
s0me-th1ng.com完成

 /\w-\w+?\.(?:org|com)\b/
当然,根据您的规则是否宽松,可以简化上述内容。以下是一个更简单的模式,但允许
s0me-th1ng.com完成

 /\w-\w+?\.(?:org|com)\b/

您可以使用前瞻:

^(?=[^.]+-[^.]+)([^.]+\.(?:org|com).*)

假设您正在寻找字母的一般模式,其中字母可以是Unicode,您可以执行以下操作:

^(?=\p{L}+-\p{L}+)([^.]+\.(?:org|com).*)
如果要添加数字:

^(?=[\p{L}0-9]+-[\p{L}0-9]+)([^.]+\.(?:org|com).*)
这样您就可以匹配
sòme1 thing.com


(Ruby 2.0+for
\p{L}
我想…

您可以使用前瞻:

^(?=[^.]+-[^.]+)([^.]+\.(?:org|com).*)

假设您正在寻找字母的一般模式,其中字母可以是Unicode,您可以执行以下操作:

^(?=\p{L}+-\p{L}+)([^.]+\.(?:org|com).*)
如果要添加数字:

^(?=[\p{L}0-9]+-[\p{L}0-9]+)([^.]+\.(?:org|com).*)
这样您就可以匹配
sòme1 thing.com

(Ruby 2.0+for
\p{L}
我想…

这可能会有帮助:

/[a-z0-9]+-?[a-z0-9]+\.(org|com)(\.[a-z]+)?/i

它在中间匹配“--”,也就是说,在没有“--”的情况下仍然匹配名称。

这可能有帮助:

/[a-z0-9]+-?[a-z0-9]+\.(org|com)(\.[a-z]+)?/i

它在中间匹配“--”,也就是说,在没有写“--”的情况下仍然匹配名称。

在编写HTTP服务器…

时,我也遇到了类似的问题。 …我最终使用了以下Regexp:

        m = url.match /(([a-z0-9A-Z]+):\/\/)?(([^\/\:]+))?(:([0-9]+))?([^\?\#]*)(\?([^\#]*))?/
        m[1] # => requested_protocol (optional) - i.e. https, http, ws, ftp etc'
        m[4] # => host_name (optional) - i.e. www.my-site.com
        m[6] # => port (optional)
        m[7] #=> encoded URI - i.e. /index.htm
如果您试图验证主机名,只需确保它不包含少数非法字符(:,/),并且至少包含一个点分隔字符串

如果只想验证.com或.org(+国家代码),可以执行以下操作:

(?:https?:\/\/)?(?:www\.)?[a-z0-9-]+\.(?:com|org)(?:\.[a-z]{2,3})?
 ^--- Notice "?:" to use non capturing groups
def is_legit_url?(url)
   allowed_master_domains = %w{com org}
   allowed_country_domains = %w{sg it uk}
   url.match(/[^\/\:]+\.(#{allowed_master_domains.join '|'})(\.#{allowed_country_domains.join '|'})?/i) && true
end
*请注意,某些国家使用.co,即英国使用www.amazon.co.UK

出于性能原因,我会将Regexp转换为常量:

module MyURLReview
    ALLOWED_MASTER_DOMAINS = %w{com org}
    ALLOWED_COUNTRY_DOMAINS = %w{sg it uk}
    DOMAINS_REGEXP = /[^\/\:]+\.(#{ALLOWED_MASTER_DOMAINS.join '|'})(\.#{ALLOWED_COUNTRY_DOMAINS.join '|'})?/i

    def self.is_legit_url?(url)
       url.match(DOMAINS_REGEXP) && true
    end
end

祝你好运!

我在编写HTTP服务器时遇到了类似的问题

…我最终使用了以下Regexp:

        m = url.match /(([a-z0-9A-Z]+):\/\/)?(([^\/\:]+))?(:([0-9]+))?([^\?\#]*)(\?([^\#]*))?/
        m[1] # => requested_protocol (optional) - i.e. https, http, ws, ftp etc'
        m[4] # => host_name (optional) - i.e. www.my-site.com
        m[6] # => port (optional)
        m[7] #=> encoded URI - i.e. /index.htm
如果您试图验证主机名,只需确保它不包含少数非法字符(:,/),并且至少包含一个点分隔字符串

如果只想验证.com或.org(+国家代码),可以执行以下操作:

(?:https?:\/\/)?(?:www\.)?[a-z0-9-]+\.(?:com|org)(?:\.[a-z]{2,3})?
 ^--- Notice "?:" to use non capturing groups
def is_legit_url?(url)
   allowed_master_domains = %w{com org}
   allowed_country_domains = %w{sg it uk}
   url.match(/[^\/\:]+\.(#{allowed_master_domains.join '|'})(\.#{allowed_country_domains.join '|'})?/i) && true
end
*请注意,某些国家使用.co,即英国使用www.amazon.co.UK

出于性能原因,我会将Regexp转换为常量:

module MyURLReview
    ALLOWED_MASTER_DOMAINS = %w{com org}
    ALLOWED_COUNTRY_DOMAINS = %w{sg it uk}
    DOMAINS_REGEXP = /[^\/\:]+\.(#{ALLOWED_MASTER_DOMAINS.join '|'})(\.#{ALLOWED_COUNTRY_DOMAINS.join '|'})?/i

    def self.is_legit_url?(url)
       url.match(DOMAINS_REGEXP) && true
    end
end

祝你好运!

这实际上并没有检查域名部分是否包含
-
@GregHewgill你是否至少停留了2秒钟阅读正则表达式??你认为
[a-z-]+
有什么作用?不用担心,我知道我肯定误读了我的问题。他没有说任何关于协议的事情。你怎么知道他没有使用FTP或其他各种协议@vol7ron是的,我知道这就是为什么我只是使用http,OP可以很容易地扩展或摆脱协议。我的答案背后的想法是帮助OP不要写一个完美的答案,所以只需要一个简单的正则表达式就可以帮助他们。这实际上并没有检查域名部分是否包含
-
@GregHewgill你是否至少停留了2秒钟来阅读正则表达式??你认为
[a-z-]+
有什么作用?不用担心,我知道我肯定误读了我在这方面的问题:他没有说任何关于礼节的事。你怎么知道他没有使用FTP或其他各种协议@vol7ron是的,我知道这就是为什么我只是使用http,OP可以很容易地扩展或摆脱协议。我的答案背后的想法是帮助OP不要写一个完美的答案,所以只要一个简单的正则表达式就可以帮助他们了。