grep匹配字符串正则表达式powershell

时间:2018-05-03 09:25:37

标签: regex powershell

如何从文本文件中获取模式匹配? 我有一个像下面的字符串。

2018-04-10 08:10:35 M2686678688 abc-jhg-jj-kjk
<accepted> M1236687688</accepted>

我使用如下:

Get-ChildItem $path\a.txt | Select-String "M(\d{10})"

不确定如何仅从上面获取匹配的字符串。 期望的输出应该是:

M2686678688 
M123668768

4 个答案:

答案 0 :(得分:2)

这应该这样做,使用Select-String来处理文件。

它为每个匹配输出MatchInfo对象,然后你需要第一个,捕获组,然后是匹配的值:

$values = select-string -Path "$path\a.txt" -Pattern 'M(\d{10})' |
    ForEach-Object { 
        $_.Matches[0].Groups[1].Value
    }

答案 1 :(得分:1)

您需要做的就是删除捕获组并展开匹配的值:

Get-ChildItem $path\a.txt |
    Select-String 'M\d{10}' |
    Select-Object -Expand Matches |
    Select-Object -Expand Groups |
    Select-Object -Expand Value

如果&#34; M&#34;之后有不同的位数。您可能还希望将表达式调整为M\d+之类的内容。如果位数必须在特定范围内,您可以使用模式M\d{MIN,MAX},例如M\d{5,}表示至少包含5位数的字符串,或M\d{7,15}表示至少包含7位数且最多包含15位数的字符串。

答案 2 :(得分:1)

当您使用“\ d {10}”时,它基本上会检查10次,而在您的第二行示例中只有9位数,因此您无法获得第二次匹配。

其次,不是使用get-childItem,而是使用Get-Content的path参数指定相同的目的。      Get-Content -Path a.txt | %{[Regex] ::匹配($ ,“M([0-9] *)”)} | %{$ .Value}  你会得到所有匹配的结果。

答案 3 :(得分:0)

首先,你的模式永远不会匹配第二个值(M123668768),因为你正在寻找一个M后跟10个数字,而这个值只有9.所以如果你想匹配这两个值正确的正则表达式将是:

M\d+

现在您可以创建Regex对象

$regex = [Regex]::new("M\d+")

并获取所有匹配

$regex.Matches("2018-04-10 08:10:35 M2686678688 abc-jhg-jj-kjk
<accepted> M123668768</accepted>")

要仅获取匹配值,您可以添加.Value

$regex.Matches("2018-04-10 08:10:35 M2686678688 abc-jhg-jj-kjk
<accepted> M123668768</accepted>").Value