如何从文本文件中获取模式匹配? 我有一个像下面的字符串。
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
答案 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