Regex 主机文件的正则表达式的行为不同

Regex 主机文件的正则表达式的行为不同,regex,powershell,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 它的行为符合预期,并输出所有我的条目(仅我的条目)

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

我观察到不同的行为:

  • 设置:

    $hostsFile = "$env:windir\System32\drivers\etc\hosts"
    $hostsRegex = '^\s*(?<Address>[0-9\.\:]+)\s+(?<Host>[\w\.\-]+)\s*$'
    
    $entries = Get-Content $hostsFile -Encoding Ascii
    
    它的行为符合预期,并输出所有我的条目(仅我的条目)

  • 使用.Net
    Regex.Matches
    方法:

    [Regex]::Matches($entries, $hostsRegex)
    
    不返回任何内容(也尝试使用诸如
    多行
    单线
    等选项

  • 我的目标是获得一个自定义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
    
    函数获取主机哨兵{
    $hostsFile=“$env:windir\System32\drivers\etc\hosts”
    $hostsRegex='^\s*(?[0-9\.\:]+)\s+(?[\w\.\-]+)\s*$'
    $entries=获取内容$hostsFile-编码Ascii
    [Regex]::匹配($entries,$hostsRegex)|%{
    新对象PSObject-属性@{
    地址=$\组[“地址”].值
    主机=$\组[“主机”].Value
    }
    }
    }
    抓住人质和哨兵
    
    但是什么也没有归还

    因此,我的问题是:

  • 为什么PowerShell和.Net调用的行为方式不同
  • 如何修复我的脚本以使其按预期工作

  • 使用
    -Raw
    将文件读入单个字符串。否则
    获取内容
    将提供字符串列表,而
    [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)
    
    $hostsFile=“$env:windir\System32\drivers\etc\hosts”
    $entries=获取内容$hostsFile-编码Ascii-原始
    $hostsRegex=[Regex]'(?m)^\s*(?[0-9:]+)\s+(?[\w.-]+)'
    $hostsRegex.Matches($entries)
    
    对我来说很好

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


    最后,我立即将表达式转换为
    [Regex]
    ,从而消除了以后跳转“静态方法”的必要性。

    使用
    -Raw
    将文件读取为单个字符串。否则
    获取内容
    会给您一个字符串列表,而
    [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)
    
    $hostsFile=“$env:windir\System32\drivers\etc\hosts”
    $entries=获取内容$hostsFile-编码Ascii-原始
    $hostsRegex=[Regex]'(?m)^\s*(?[0-9:]+)\s+(?[\w.-]+)'
    $hostsRegex.Matches($entries)
    
    对我来说很好

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


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

    $entries
    是字符串的集合,
    Regex.Matches()
    将单个字符串作为其第一个参数
    $entries
    是字符串的集合,
    Regex.Matches()
    将单个字符串作为其第一个参数使用
    -raw
    解决了我的问题(还在方法调用中指定了
    多行
    参数)。谢谢!使用
    -raw
    解决了我的问题(还在方法调用中指定了
    多行
    参数)。谢谢!