Regex 主机文件的正则表达式的行为不同
我想从PowerShell脚本解析我的主机文件 我观察到不同的行为: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 它的行为符合预期,并输出所有我的条目(仅我的条目)
$hostsFile = "$env:windir\System32\drivers\etc\hosts"
$hostsRegex = '^\s*(?<Address>[0-9\.\:]+)\s+(?<Host>[\w\.\-]+)\s*$'
$entries = Get-Content $hostsFile -Encoding Ascii
它的行为符合预期,并输出所有我的条目(仅我的条目)Regex.Matches
方法:
[Regex]::Matches($entries, $hostsRegex)
不返回任何内容(也尝试使用诸如多行
、单线
等选项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
}
}
}
抓住人质和哨兵
但是什么也没有归还
因此,我的问题是:
使用
-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
解决了我的问题(还在方法调用中指定了多行
参数)。谢谢!