【问题标题】:Identify when multiple domains are provided using regular expression使用正则表达式识别何时提供多个域
【发布时间】:2019-02-15 19:04:34
【问题描述】:

我正在使用 C# 表单,其中用户提供两个主机的 FQDN,此信息稍后用于安装一些仅在两个 FQDN 位于同一域中时才有效的功能。我最初将两个主机名和一个域名放在不同的字段中,但这让用户感到困惑。基本上,我想检测这些 FQDN 字段中何时提供了不同的域。例如-

有效输入:

host1.domain1.example
host2.domain1.example

输入无效:

host1.domain1.example
host2.domain2.example

我想检测无效输入,但它比我想象的要复杂。

【问题讨论】:

  • 用正则表达式解析域名会产生许多人们在上面忘记的边缘情况。这就像在 XML/HTML 上使用正则表达式:不好。 www.dk 的域名是什么? (它是www.dk)。对于www.example.co.uk,域名是什么(它是example.co.uk)。等等。不,在所有一般情况下,您不能在第一个点上拆分(对于www.intranet.example.com,您想要的域名是什么?可能是example.com)等等。所以相反:从您关心的 TLD 列表开始,提取这些 TLD 中的域(简单:domain = label.TLD),然后比较域。
  • 这也很难,因为这些域通常是内部的,并且故意使用一些晦涩的命名,所以我见过从“青色”到带有破折号的 TLD 的任何地方。这使得对用户可能拥有的可能 TLD 进行编目变得困难。由于这些 FQDN 将用于 AD 控制的 Windows 主机,因此我不担心剥离 www 之类的内容,但有些 FQDN 可能不仅仅是简单的 host.domain.example 格式,所以这会导致问题。我可能只是回到为主机名设置两个字段,而对域只有一个字段,然后将它们组合为 FQDN。

标签: c# regex dns


【解决方案1】:

遵循正则表达式会有所帮助。它满足您当前的文本请求。如果你认为你的文本会有,你可以做一些小的改动。如果您有任何问题,请告诉我。

在示例页面的右侧,它描述了代码在做什么,因此请参阅该说明。

正则表达式:
(?:\w+)\.(\w+)(?:\.\w+)*\n(?:\w+)\.(?:\1)(?:\.\w+)*

示例:
https://regex101.com/r/ZDG4Ba/4

【讨论】:

  • 啊,抱歉,我第一次发布时的格式使我的条目达到了一行。根据帖子的格式,我看到了你得到的结果。编辑后的原始帖子应该更准确地传达我的意思。
  • 更新了我的答案。如果满足您的要求,请查看并接受。
  • 感谢您的更新。我还应该澄清一下,FQDN 是在单独的字段中提供的,因此从技术上讲,这两个值之间没有换行符,而是将它们作为两个单独的变量包含在内。它们是从我的 main.cs 表单上的 FQDNpriFQDNsec 表单中提取的,例如 - string FQDNPrimary = FQDNPri.Text.ToString(); string FQDNSecondary = FQDNSec.Text.ToString(); 所以我想获取 FQDNPrimary 和 FQDNSSecondary 字符串并将它们相互比较。我可以尝试以换行符分隔的格式重新存储它们并测试该正则表达式。
  • 我相信我将不可避免地遇到的问题之一是当用户在其域中具有额外的. 字符时,例如,有时我会在具有 FQDN 的开发环境中找到某些东西喜欢host.dev.domain.tld。我想我只是让用户提供两个主机名,然后为域提供一个单独的字段,然后我会将它们组合为 FQDN。不过,感谢您的建议,这绝对是在正确的轨道上。
  • 你不会的,我已经再次更新了正则表达式并更新了示例。因此,您担心的是,如果域以abc.co.in 的形式出现,那么它将不会被抢占。现在我进行了更改,它将接受域的多个扩展。看看,让我知道它是否有效。如果是,请接受答案。如果没有,请告诉我,我会看看需要更新的内容。
猜你喜欢
  • 1970-01-01
  • 2014-09-15
  • 2011-10-02
  • 1970-01-01
  • 2019-09-14
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多