在PowerShell中组合两个正则表达式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在PowerShell中组合两个正则表达式相关的知识,希望对你有一定的参考价值。
这是我要解析的数据:
10.186.128.0/20 172.17.128.161 0 65000 8788
10.186.128.0/20 172.17.128.161 0 65000 878
10.186.128.0/20 172.17.128.161 0 65000 87
理想情况下,输出应与行开头的IP地址相匹配,并且最后2位或3位或4位数字也应匹配。所需输出示例:
10.186.128.0/20 8788
10.186.128.0/20 878
10.186.128.0/20 87
我拥有与IP地址"10\.\d*\.\d*\.\d*\/\d\d"
相匹配的正则表达式
然后我有第二个正则表达式将匹配最后2或3或4位数字" \d4$| \d3$| \d2$"
问题是如何在PowerShell中结合这两个正则表达式以实现所需的结果?
谢谢
您可以使用
Get-Content $filepath | Select-String '^(10(?:\.\d+)3/\d+)\s.*\s(\d+)$' -AllMatches | Foreach-Object $_.Matches | Foreach-Object $_.Groups[1].Value + " " + $_.Groups[2].Value
^(10(?:\.\d+)3/\d+)\s.*\s(\d+)$
正则表达式-参见its online demo-匹配项:
- [
^
-字符串开头 - [
(10(?:\.\d+)3/\d+)
-组1:10
,然后是一个点的三个重复和任意1+位数字,然后是/
和1+位数字 - [
\s.*\s
-空格,除换行符以外的任何0+个字符,尽可能多,还有一个空格] (\d+)
-组2:1个以上的数字- [
$
-字符串结尾。
所以,
- [
Get-Content $filepath
读取文件 - [
Select-String '^(10(?:\.\d+)3/\d+)\s.*\s(\d+)$' -AllMatches
通过逐行读取文件从文件中获取所有匹配项 - [
Foreach-Object $_.Matches
一场抢下所有比赛 - [
Foreach-Object $_.Groups[1].Value + " " + $_.Groups[2].Value
合并组1和2的值。
如果只需要一种快速的方法来修改字符串,用这两个正则表达式之一简单替换:
$string -replace '(?<=\b10\.\d0,3\.\d0,3\.\d0,3/\d2).*(?=[ \t]\d1,4\b)', ''
或
$string -replace '(?m)(?<=^[ \t]*10\.\d0,3\.\d0,3\.\d0,3/\d2).*(?=[ \t]\d1,4[ \t]*$)', ''
如果您的所有数据始终采用发布格式,则使用-split
似乎要简单得多。
Get-Content -Path file.txt |
Foreach-Object [string]($_ -split ' ')[0,-1]
说明:
-split
使用正则表达式匹配将字符串拆分为字符串数组。在此,字符串是根据单个空格分割的。 [0,-1]
选择数组的第一个(索引0)和最后一个(索引-1)元素。
[string]
将两个数组元素强制转换为字符串。由于PowerShell在将两个项目强制转换为字符串时会自动使用空格将两个项目连接在一起,因此这仅仅是一种快捷方式。
以上是关于在PowerShell中组合两个正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
复杂的正则表达式 - 在Powershell中工作,而不是在Bash中工作
求密码是由6-18位字母和数字的混合组成的正则表达式的js代码,谢谢各位大神!!
在 PowerShell 中的正则表达式匹配的每个实例之后附加字符