Ruby 如何修改此正则表达式以排除URL中的标点符号?

Ruby 如何修改此正则表达式以排除URL中的标点符号?,ruby,regex,pattern-matching,Ruby,Regex,Pattern Matching,我已经修改了我发现的一个正则表达式,以便它可以接受各种英国和二级TLD /\b((?:^https?:\/\/|^[a-z0-9.\-]+[.][a-z]{2,4})(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!@()\[\]{};:'".,<>?]))/i /\b((?:^http

我已经修改了我发现的一个正则表达式,以便它可以接受各种英国和二级TLD

/\b((?:^https?:\/\/|^[a-z0-9.\-]+[.][a-z]{2,4})(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!@()\[\]{};:'".,<>?]))/i
/\b((?:^https?:\/\/\/\^[a-z0-9.\-]+[.][a-z]{2,4})(?:[^\s()]+\\(([^\s()]+\(\([^\s()]+\)*)+(?:\([^\s()]+\([^\s())+(\([^\s())+)+)*)*)([^\s())+([^-]
但是,正如您在我的测试数据中看到的,正则表达式匹配的URL,例如
www.zapple@com
https://m!crosoft.com
,这些URL无效

由于某种原因,
@
符号在
.com
之前被排除,但在
之后则不被排除

感叹号完全没有被排除在外,这让人感到困惑,因为据我所知,在句点之前只允许字母、数字和破折号。

这个@与

[^\s()<>]+
更新1

这与m!crosoft.com和@pple.com不匹配,这可能是由于与Rublar有关


我非常了解正则表达式,但正则表达式非常可怕;)为什么不使用
URI
(或
Addressable::URI
)解析URL,然后在“.”上拆分主机Wow,嗯……我不想让我的名字出现在那一点混乱中。我会分解任务。首先标记它。然后验证序言。然后验证域。等等。我只是不断地攻击它,直到它符合我想要的。我没有使用regex的经验,所以我决定使用
URI::regexp(%w(http https))
方法。用户友好程度较低,但解决方案更干净。根据Rublar的说法,这仍然与
m!crosoft.com
@pple.com
相匹配。它也与
hxxp://www.g00gle.com
。它与m!crosoft.com和@pple.com不匹配。我用匹配项更新了我的答案。正如你所说,这一定是一个Rublar错误。那是什么程序出于兴趣?
(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+
^
(# Scheme
 [a-z][a-z0-9+\-.]*:
 (# Authority & path
  //
  ([a-z0-9\-._~%!$&'()*+,;=]+@)?              # User
  ([a-z0-9\-._~%]+                            # Named host
  |\[[a-f0-9:.]+\]                            # IPv6 host
  |\[v[a-f0-9][a-z0-9\-._~%!$&'()*+,;=:]+\])  # IPvFuture host
  (:[0-9]+)?                                  # Port
  (/[a-z0-9\-._~%!$&'()*+,;=:@]+)*/?          # Path
 |# Path without authority
  (/?[a-z0-9\-._~%!$&'()*+,;=:@]+(/[a-z0-9\-._~%!$&'()*+,;=:@]+)*/?)?
 )
|# Relative URL (no scheme or authority)
 ([a-z0-9\-._~%!$&'()*+,;=@]+(/[a-z0-9\-._~%!$&'()*+,;=:@]+)*/?  # Relative path
 |(/[a-z0-9\-._~%!$&'()*+,;=:@]+)+/?)                            # Absolute path
)
# Query
(\?[a-z0-9\-._~%!$&'()*+,;=:@/?]*)?
# Fragment
(\#[a-z0-9\-._~%!$&'()*+,;=:@/?]*)?
$