Powershell 抓取字符串的较短语法?[选择字符串]
我在Powershell中使用Select字符串进行了大量正则表达式匹配 例如,最简单也是最常见的匹配,IPv4地址:Powershell 抓取字符串的较短语法?[选择字符串],powershell,Powershell,我在Powershell中使用Select字符串进行了大量正则表达式匹配 例如,最简单也是最常见的匹配,IPv4地址: $regex = \b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b 现在,如果我用一句话来匹配这句话: $output=` “BLAH BLAH BLAH,202.100.100.9,您将匹配这条线中间的IP, 但不在此行上,因为“2.a.
$regex = \b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
现在,如果我用一句话来匹配这句话:
$output=`
“BLAH BLAH BLAH,202.100.100.9,您将匹配这条线中间的IP,
但不在此行上,因为“2.a.3.one”不是有效的IPv4地址” 然后我会:$output | Select-String $regex
它会给我整条线
我真的不能用它的原始形式
但是,如果我使用此选项:
$output | Select-String $regex | %{$_.Matches} | %{$_.Value}
它只会给我IP地址,这很好
我的问题是:
有更简单的方法吗?
我不希望每次只想获取一个特定字符串时都键入|%{$.Matches}|%{$.Value}。尝试以下方法:
$output -replace ".*($regex).*",'$1'
试试这个:
$output -replace ".*($regex).*",'$1'
如果您更喜欢选择字符串而不是-replace操作符(这只是调用[Regex]::replace的语法糖),那么PowerShell V3有一些快捷方式可以节省一些输入 首先,Select String=>sls有一个别名。 其次,使用简单的foreach对象脚本块,您可以仅使用属性替换脚本块 结合这些,您可以使用
$output | sls $regex | % Matches | % Value
为了节省更多的输入,PowerShell可以标记完全匹配,但不能标记值
另一个更少键入的选项是使用属性语法:
($output | sls $regex).Matches.Value
作为奖励,在本例中,选项卡完成可以完成匹配和值。请注意,第二个示例在V2中有效,但仅当存在单个匹配行时有效。如果有多个匹配行,只有在V3中才能看到所有结果,如果启用了严格模式,V2将不会显示任何内容或错误。如果您更喜欢选择字符串而不是-replace运算符(这只是调用[Regex]::replace的语法糖),PowerShell V3有一些快捷方式可以节省一些键入 首先,Select String=>sls有一个别名。 其次,使用简单的foreach对象脚本块,您可以仅使用属性替换脚本块 结合这些,您可以使用
$output | sls $regex | % Matches | % Value
为了节省更多的输入,PowerShell可以标记完全匹配,但不能标记值
另一个更少键入的选项是使用属性语法:
($output | sls $regex).Matches.Value
作为奖励,在本例中,选项卡完成可以完成匹配和值。请注意,第二个示例在V2中有效,但仅当存在单个匹配行时有效。如果有多个匹配行,只有在V3中才能看到所有结果,如果启用严格模式,V2将不会显示任何内容或错误。首先,我要感谢所有人的帮助和他们为我解决这一问题所做的努力。你所有的建议都很好,很有用 我有一个想法,我意识到我正在寻找一个并不存在的命令,所以我只是为它编写了一个函数:
function Regex-Match {
[cmdletbinding()]
param (
[parameter(Position=0,Mandatory=$true,ValueFromPipeline=$false)]$RegexString,
[parameter(Position=1,Mandatory=$true,ValueFromPipeline=$true)]$SearchString
)
$Results = @($SearchString | Select-String -Pattern $RegexString | % {$_.Matches} | % {$_.Value})
Return $Results
}
为了进一步缩短时间,我可以使用
New-Alias -Name regx -Value Regex-match
命令示例:
"test string" | regx "\w\s\w"
或
首先,我要感谢所有人的帮助和他们为我解决这个问题所做的努力。你所有的建议都很好,很有用 我有一个想法,我意识到我正在寻找一个并不存在的命令,所以我只是为它编写了一个函数:
function Regex-Match {
[cmdletbinding()]
param (
[parameter(Position=0,Mandatory=$true,ValueFromPipeline=$false)]$RegexString,
[parameter(Position=1,Mandatory=$true,ValueFromPipeline=$true)]$SearchString
)
$Results = @($SearchString | Select-String -Pattern $RegexString | % {$_.Matches} | % {$_.Value})
Return $Results
}
为了进一步缩短时间,我可以使用
New-Alias -Name regx -Value Regex-match
命令示例:
"test string" | regx "\w\s\w"
或
这在技术上确实有效。我还发现了另一种方法,那就是将$regex变量声明为:
$regex=[regex]'pattern'
,然后允许它使用System.Text.RegularExpressions.regex
类中的方法,比如:($regex.match(“Text to search”))。Value
,不幸的是,在这两种情况下,这使得我的脚本非常慢。该死。如果这些文件真的很大,它可以做到这一点,但有办法加快速度。从技术上讲,这是可行的。我还发现了另一种方法,那就是将$regex变量声明为:$regex=[regex]'pattern'
,然后允许它使用System.Text.RegularExpressions.regex
类中的方法,比如:($regex.match(“Text to search”))。Value
,不幸的是,在这两种情况下,这使得我的脚本非常慢。该死。如果这些文件真的很大,它可以做到这一点,但有办法加快速度。如果你只有一个捕获组,你可以将上一个示例简化为:$output | sls$regex |%{$|.Matches[0].Value}
。如果你只有一个捕获组,你可以将上一个示例简化为:$output | sls$regex |%{$|.Matches[0].Value}
。