我有用于用户名匹配域的正则表达式:
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:
/
答案 0 :(得分:2)
由于已将其标记为Perl,因此Perl的答案是使用URI解析模块,例如URI或Mojo::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.
。
打破正则表达式^(?:https?:\/\/)?(?:www\.)?facebook\.com\/?$
^
字符串的开头(?:https?:\/\/)?
是一个非捕获组,它将与协议https?:\/\/
相匹配,零次或一次?
匹配(可选)(?:www\.)?
非捕获组,将在www.
上匹配一次,零次或一次?
(可选)facebook\.com
将匹配域\/?
将匹配可选的?
正斜杠\/
$
字符串的结尾 (加了强调)-这是它可以满足您的要求的原因,因为在之后前一个项目符号中的可选正斜杠。