【问题标题】:How to ignore all after domain zone except symbol "/"如何忽略除符号“/”之外的域区域之后的所有内容
【发布时间】:2019-04-25 17:55:36
【问题描述】:

我有与用户名匹配域的正则表达式:

/(?:https:\/\/)?(?:http:\/\/)?(?:www\.)?(?:facebook)\.com\/(\w+(?:\.\w+)*)$/

此正则表达式匹配示例 URL:

facebook.com/username
www.facebook.com/username
http://facebook.com/username
http://www.facebook.com/username
https://facebook.com/username
https://www.facebook.com/username

如何更改此正则表达式以仅匹配具有域区域和非必需符号 / 的 URL:

facebook.com
facebook.com/
.....................
https://facebook.com/
https://www.facebook.com

【问题讨论】:

  • 所以你想匹配只有域的字符串,末尾没有正斜杠?
  • @K.Dᴀᴠɪs 仅带或不带斜线的域名
  • 你能不能更清楚地显示以上6个URL中的哪一个应该匹配,然后解释为什么会这样?
  • 这是用于 Perl 还是 PCRE?你已经标记了两者,但它们是不同的东西
  • 如果我理解正确,这应该可以^(?:https?:\/\/)?(?:www\.)?facebook\.com\/?$

标签: regex string perl pcre


【解决方案1】:

你只想匹配只包含域的字符串,那么你可以使用这样的东西:

^(?:https?:\/\/)?(?:www\.)?facebook\.com\/?$

无论它是否具有协议 (http(s):\/\/) 以及是否包含 www.,这都会匹配。

See it live

分解正则表达式,^(?:https?:\/\/)?(?:www\.)?facebook\.com\/?$

  • ^ 字符串开头
  • (?:https?:\/\/)? 一个非捕获组,将匹配协议https?:\/\/,零次或一次?(可选)
  • (?:www\.)? 将匹配 www. 的非捕获组,零次或一次 ?(可选)
  • facebook\.com 将匹配域
  • \/? 将匹配可选的 ? 正斜杠 \/
  • $ 字符串结尾 (强调添加) - 这就是允许它满足您的要求的原因,因为这将不允许在可选正斜杠之后匹配任何内容之前的项目符号。

【讨论】:

    【解决方案2】:

    由于这被标记为 Perl,Perl 的答案是使用 URI 解析模块,例如 URIMojo::URL

    use strict;
    use warnings;
    use Mojo::URL;
    while (my $input = <<>>) { # or whatever way the input comes in
      chomp $input;
      my $url = Mojo::URL->new($input);
      next unless !defined $url->scheme or $url->scheme eq 'http' or $url->scheme eq 'https';
      next unless defined $url->host and ($url->host eq 'facebook.com' or $url->host eq 'www.facebook.com');
      next if length $url->path and $url->path ne '/';
      print "$input\n";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-02
      • 2011-07-19
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      相关资源
      最近更新 更多