如何忽略除符号“ /”以外的所有域区域

时间:2018-11-23 05:53:40

标签: regex string perl pcre

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

refs/original

此正则表达式匹配示例网址:

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

如何更改此正则表达式以仅匹配具有域区域和非必需符号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:

/

2 个答案:

答案 0 :(得分: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";
}

答案 1 :(得分:1)

您只想匹配仅包含域的字符串,那么您可以使用以下内容:

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

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

See it live

打破正则表达式^(?:https?:\/\/)?(?:www\.)?facebook\.com\/?$

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