Powershell 抓取字符串的较短语法?[选择字符串]

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.

我在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.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}