Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在PowerShell中合并两个正则表达式_Regex_Powershell_Parsing_Select String - Fatal编程技术网

Regex 在PowerShell中合并两个正则表达式

Regex 在PowerShell中合并两个正则表达式,regex,powershell,parsing,select-string,Regex,Powershell,Parsing,Select String,这是我试图解析的数据: 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.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\d匹配的正则表达式

然后我有第二个正则表达式,它将匹配最后2位、3位或4位数字\d{4}$\d{3}$\d{2}$

问题是如何在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+$regex-see-matches:

^-字符串的开头 10?:\.\d+{3}/\d+-组1:10,然后重复三次点和任何1+数字,然后是/和1+数字 \s、 *\s-一个空格、除换行符以外的任何0+字符和一个空格 \d+-第2组:1+位 $-字符串的结尾。 所以

获取内容$filepath读取文件 选择字符串“^10”:\.\d+{3}/\d+\s.*\s\d+$”-AllMatches通过逐行读取文件获取文件中的所有匹配项 Foreach对象{$\.Matches}逐个获取所有匹配项 Foreach对象{$\.Groups[1]。值+$\.Groups[2]。值}包含组1和组2的值。 如果您的所有数据都是一致的发布格式,那么使用-split似乎要简单得多

Get-Content -Path file.txt |
    Foreach-Object { [string]($_ -split ' ')[0,-1] }
说明:

-split使用正则表达式匹配将字符串拆分为字符串数组。这里,字符串是基于单个空格分割的。[0,-1]选择数组的第一个索引0和最后一个索引-1元素


[string]将两个数组元素强制转换为字符串。由于PowerShell在将两个项目强制转换为字符串时会自动将它们连接到一个空格中,因此这只是一个快捷方式。

如果只需要一种快速修改字符串的方法的话 用以下两个正则表达式中的一个进行简单替换:

$string -replace '(?<=\b10\.\d{0,3}\.\d{0,3}\.\d{0,3}/\d{2}).*(?=[ \t]\d{1,4}\b)', ''


可能是$s-替换“^10”:\.\d+{3}/\d+\s.*\s\d+$”,“$1$2”?或者,您的意思是文本包含需要首先提取的行吗?如果您尝试匹配IP地址,则点之间的数字永远不会超过3位,也不会小于1位。您应该将正则表达式更改为10\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{2}酷。谢谢我修改了我的IP匹配正则表达式。但是,如何获得IP以及字符串中的最后2、3或4位数字的期望结果?我已经为您创建了一个用于测试更多案例的空间,基本上,我已经为2到4位数字添加了一个空格a匹配。Select-string'?m^10?:\.\d+{3}/\d+\s.*\s\d+\r?$'-input$txt-ALLMATCHS | Foreach{$\ MATCHS}Foreach{$\ Foreach{.MATCHS}组[1].value++$\组[2].value}?注意这里的$txt是一个多行字符串输入。该解决方案将在PS 6.1.3中输出预期结果。该解决方案将有效删除我希望检索的零件。Wikter Stri Iee提供的解决方案完全损坏,因此应该被标记为正确答案IHOO。@ JoZeFutBuBC。结果字符串是从开始行的IP地址,也是最后2或3或4位。@ JoZeFutBaB-我从不阅读或查看其他答案,因为我认为自己是专家。这正是我想要的。非常感谢。
$string -replace '(?m)(?<=^[ \t]*10\.\d{0,3}\.\d{0,3}\.\d{0,3}/\d{2}).*(?=[ \t]\d{1,4}[ \t]*$)', ''