sharedDomains

Calculates how many dot-separated domains two strings share.

This is useful to see to what extent two addresses are similar.

Pass reverse: true to do reverse domain matching, like for flatpak application IDs.

pure @safe @nogc nothrow
sharedDomains
(
const string one
,
const string other
,
const bool reverse = false
,
const bool caseSensitive = true
)

Parameters

one string

First domain string.

other string

Second domain string.

reverse bool

Whether or not to do reverse domain matching.

caseSensitive bool

Whether or not comparison should be done on a case-sensitive basis.

Return Value

Type: auto

The number of domains the two strings share.

TODO: Support partial globs.

Examples

int numDomains = sharedDomains("irc.freenode.net", "leguin.freenode.net");
assert(numDomains == 2);  // freenode.net

int numDomains2 = sharedDomains("Portlane2.EU.GameSurge.net", "services.gamesurge.net", caseSensitive:false);
assert(numDomains2 == 2);  // gamesurge.net

int numDomains3 = sharedDomains("org.kde.Platform", "org.kde.KStyle.Awaita", reverse: true);
assert(numDomains3 == 2);  // org.kde
1 import std.conv : text;
2 
3 {
4     immutable n = sharedDomains("irc.freenode.net", "help.freenode.net");
5     assert((n == 2), n.text);
6 }
7 {
8     immutable n = sharedDomains("irc.rizon.net", "services.rizon.net");
9     assert((n == 2), n.text);
10 }
11 {
12     immutable n = sharedDomains("www.google.com", "www.yahoo.com");
13     assert((n == 1), n.text);
14 }
15 {
16     immutable n = sharedDomains("www.google.se", "www.google.co.uk");
17     assert((n == 0), n.text);
18 }
19 {
20     immutable n = sharedDomains("", string.init);
21     assert((n == 0), n.text);
22 }
23 {
24     immutable n = sharedDomains("irc.rizon.net", "rizon.net");
25     assert((n == 2), n.text);
26 }
27 {
28     immutable n = sharedDomains("rizon.net", "rizon.net");
29     assert((n == 2), n.text);
30 }
31 {
32     immutable n = sharedDomains("net", "net");
33     assert((n == 1), n.text);
34 }
35 {
36     immutable n = sharedDomains("forum.dlang.org", "...");
37     assert((n == 0), n.text);
38 }
39 {
40     immutable n = sharedDomains("blahrizon.net", "rizon.net");
41     assert((n == 1), n.text);
42 }
43 {
44     immutable n = sharedDomains("rizon.net", "blahrizon.net");
45     assert((n == 1), n.text);
46 }
47 {
48     immutable n = sharedDomains("rizon.net", "irc.rizon.net");
49     assert((n == 2), n.text);
50 }
51 {
52     immutable n = sharedDomains("irc.gamesurge.net", "Stuff.GameSurge.net", caseSensitive:false);
53     assert((n == 2), n.text);
54 }
55 {
56     immutable n = sharedDomains("irc.freenode.net", "irc.FREENODE.net", caseSensitive:false);
57     assert((n == 3), n.text);
58 }
59 
60 /+
61     Reverse domains, like those of flatpak application IDs.
62  +/
63 {
64     immutable n = sharedDomains("irc.SpotChat.org", "irc.FREENODE.net", caseSensitive:false);
65     assert((n == 0), n.text);
66 }
67 {
68     immutable n = sharedDomains("org.kde.Plasma", "org.kde.Kate", reverse: true);
69     assert((n == 2), n.text);
70 }
71 {
72     immutable n = sharedDomains("com.redhat.Something", "com.redhat.Other", reverse: true);
73     assert((n == 2), n.text);
74 }
75 {
76     immutable n = sharedDomains(
77         "org.freedesktop.Platform.GL.default",
78         "org.freedesktop.Platform.VAAPI.Intel",
79         reverse: true);
80     assert((n == 3), n.text);
81 }
82 {
83     immutable n = sharedDomains("org.kde.Platform", "im.riot.Riot", reverse: true);
84     assert((n == 0), n.text);
85 }