【发布时间】:2017-05-04 20:57:46
【问题描述】:
我需要一个函数:
f(fqdn,suffix) -> basedomain
使用这些示例输入和输出:
f('foobar.quux.somedomain.com','com') -> 'somedomain.com'
f('somedomain.com','com') -> 'somedomain.com'
f('foobar.quux.somedomain.com.br','com.br') -> 'somedomain.com.br'
f('somedomain.com.br','com.br') -> 'somedomain.com.br'
用简单的英语,如果suffix 有n 段,则取最后一个n+1 段。找到 FQDN 的基域,考虑到某些 FQDN 有多个后缀元素这一事实。
我需要匹配的后缀是here。我已经在我的 SQL 数据库中获得了它们。
我可以用 C# 写这个;它可能不是最优雅的,但它会起作用。不幸的是,我希望在最接近数据的 T-SQL 或 Powershell 中使用此功能,这是使用此数据的其余实用程序将在其中使用的地方。我想可以在 C# 中执行此操作,编译为程序集,然后从 T-SQL 甚至从 Powershell 访问它……如果这将是最快的执行。如果在纯 T-SQL 或简单的 Powershell 中有一些相当聪明的替代方案,我会喜欢的。
编辑:我忘记明确提及的一件事(但在查看后缀列表时很清楚,在我上面的链接中)是我们必须选择 longest 匹配的后缀。 “br”和“com.br”都出现在后缀列表中(类似的事情发生在 uk、pt 等)。所以 SQL 必须使用窗口函数来确保找到最长的匹配后缀。
这是我在执行 SQL 时的进度。我迷失在所有substring/reverse 函数中。
SELECT Domain, suffix
FROM (
SELECT SD.Domain, SL.suffix,
RN=ROW_NUMBER() OVER (
PARTITION BY sd.Domain ORDER BY LEN(SL.suffix) DESC)
FROM SiteDomains SD
INNER JOIN suffixlist SL ON SD.Domain LIKE '%.'+SL.suffix
) AS X
WHERE RN=1
这适用于找到正确的后缀。不过我有点担心它的性能。
【问题讨论】:
-
我假设您会在 C# 中使用 .NET 字符串操作来完成任务,对吧?如果是这样,您可以在 powershell 中执行完全相同的操作(字符串处理是相同的,并且 C# 中可用的所有方法在 Powershell 中也可用)
-
$fqdn -replace ".*?(?=[^.]+\.$suffix)" -
@TessellatingHeckler 哇。这是一个非常简短的正则表达式解决方案。不幸的是,它不能证明像 foo.bar.com.br.something.com.br 甚至像 my.computers.com 这样的东西
-
我认为有更好的方法,而不是依赖正则表达式和字符串操作。 *.com/questions/10735190/… 这应该很容易转换为 PowerShell 以及
[system.uri]
标签: tsql powershell fqdn