regex - 主机文件的正则表达式的行为有所不同

标签 regex powershell

我想从PowerShell脚本解析我的主机文件。

我观察到了不同的行为:

  • 设置:
    $hostsFile = "$env:windir\System32\drivers\etc\hosts"
    $hostsRegex = '^\s*(?<Address>[0-9\.\:]+)\s+(?<Host>[\w\.\-]+)\s*$'
    
    $entries = Get-Content $hostsFile -Encoding Ascii
    
  • 使用-match:
    $entries -match $hostsRegex
    

    它的行为符合预期,并输出我的所有条目(并且仅输出我的条目)。
  • 使用.Net Regex.Matches方法的
  • :
    [Regex]::Matches($entries, $hostsRegex)
    

    什么也不返回(也尝试使用MultilineSingleLine等选项...

  • 我的目标是获取自定义PS对象,以进行进一步处理。其实我希望这能工作:
    function Get-HostsEntries{
        $hostsFile = "$env:windir\System32\drivers\etc\hosts"
        $hostsRegex = '^\s*(?<Address>[0-9\.\:]+)\s+(?<Host>[\w\.\-]+)\s*$'
    
        $entries = Get-Content $hostsFile -Encoding Ascii
    
        [Regex]::Matches($entries, $hostsRegex ) | %{
            New-Object PSObject -Property @{
                Address = $_.Groups["Address"].Value
                Host = $_.Groups["Host"].Value
            }
        }
    }
    
    Get-HostsEntries
    

    但是什么也没返回。

    所以我的问题是:
  • 为什么PowerShell和.Net调用的行为方式不同?
  • 如何修复脚本以按预期工作?
  • 最佳答案

    使用-Raw将文件读取为单个字符串。否则,Get-Content会为您提供[Regex]::Matches无法处理的字符串列表。

    $hostsFile = "$env:windir\System32\drivers\etc\hosts"
    $entries = Get-Content $hostsFile -Encoding Ascii -Raw
    
    $hostsRegex = [Regex]'(?m)^\s*(?<Address>[0-9.:]+)\s+(?<Host>[\w.-]+)'
    $hostsRegex.Matches($entries)
    

    对我来说很好。

    注意正则表达式中的(?m)多行修饰符。另外,也不必在字符类中转义.:-

    最后,将表达式直接转换为[Regex],从而消除了以后跳过“静态方法”箍的需要。

    关于regex - 主机文件的正则表达式的行为有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41220400/

    相关文章:

    ruby-on-rails - 正则表达式 : How do I grab a block of text using regex?(在 ruby​​ 中)

    c# - 如何匹配一个字符串,但前提是同一字符串尚未匹配或不匹配破折号?

    regex - 如何在 powershell 中使用正则表达式在第一次出现时进行拆分

    powershell - 自定义PowerShell Cmdlet不接受变量

    c# - 正则表达式:找到整数但不是 float

    JavaScript 函数转义 Java 正则表达式字符串

    python - 如何在 Python 中始终如一地将 "3.71B"和 "4M"等字符串转换为数字?

    Powershell 删除项不起作用

    Azure:无法安装正确推送到工件源存储库的 PowerShell 模块

    c# - 无法在PowerShell 3.0和2.0中取消分配内存