【问题标题】:Need to accurately write RegEx query需要准确编写RegEx查询
【发布时间】:2026-01-04 16:30:02
【问题描述】:

我有一段我提取的 html 代码:

Server Address</span></td><td    ><span  class="hpPageText" >hostname0403.domain.tld</span></td><

我试图从这个字符串中提取 fqdn (hostname0403.domain.tld)。我想我会使用以下逻辑:

  1. 以 > 开头,以 结尾
  2. 必须包含至少 1 个句点(点)。
  3. 必须包含所有数字、所有字母或两者的组合。

我希望最终得到的是 ">hostname0403.domain.tld

$reg = ">[\w\.]+<"

我对正则表达式很陌生,虽然这确实有效,但我不确定它是否安全。任何帮助将不胜感激。

【问题讨论】:

  • 仅作记录:不建议使用 RegEx 解析 HTML。但是为了帮助您,重要的是该 HTML-Stuff 的哪些部分改变了哪些部分不改变。
  • 回应@DasKrümelmonster 所说的:请参阅this answer,了解为什么一般不应使用正则表达式来解析HTML。
  • Mybe 对你的目的来说有点矫枉过正,但我​​会去htmlagilitypack.codeplex.com

标签: c# .net regex powershell


【解决方案1】:

正则表达式模式需要一些工作。例如,主机名之前和/或之后可能有空格。主机名可以包含“-”字符。您可以像这样处理空格:

'>\s*(..hostname regex)\s*<'

要获得更好的主机名正则表达式,请参阅SO 答案。以下是您将如何修改该正则表达式以满足您的需求:

$str = 'Server Address</span></td><td    ><span  class="hpPageText" >hostname0403.domain.tld</span></td><'
$ValidHostnameRegex = ">\s*((?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*(?:[A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9]))\s*<"
$str -match $ValidHostnameRegex
$matches[1]

输出:

hostname-0403.domain.tld

【讨论】:

    【解决方案2】:

    您可以使用以下内容(作为奖励,Regex 为您排除了 > 和

            string source = @"Server Address</span></td><td    ><span  class=""hpPageText"" >hostname0403.domain.tld</span></td><";
            Regex r = new Regex(@"(?<=\>)(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])(?=\<)");
    
            string fqdn = "";
            Match fqdnMatch = r.Match(source);
            if (fqdnMatch.Success)
            {
                fqdn = fqdnMatch.Value;
            }
    

    【讨论】:

    • 谢谢。当我使用你的正则表达式时,我得到了 4 个匹配项:tld、域、域。和 fqdn。我希望它只返回 1 - fqdn。
    • 如果你想消除组,你可以用这个代替:"(?)(?:(?:[a-zA-Z0-9]|[a-zA -Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*(?:[A-Za-z0-9]|[A-Za-z0 -9][A-Za-z0-9\-]*[A-Za-z0-9])(?=\