powershell 中的正则表达式前瞻
Regex lookahead in powershell
我正在尝试从遗留服务器的路由打印文件转储中提取信息并使用正则表达式对其进行解析。作为其中的一部分,我试图只提取 IPv4 路由信息。该文件看起来像这样...
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.1.1 192.168.0.24 20
===========================================================================
Persistent Routes:
None
IPv6 Route Table
===========================================================================
Active Routes:
If Metric Network Destination Gateway
1 306 ::1/128 On-link
===========================================================================
Persistent Routes:
None
我正在尝试使用 lookbehind/lookahead 方法 (?<=ce Metric)(?s)(.*)(?=={75})
来获取 IPv4 路由。
0.0.0.0 0.0.0.0 192.168.1.1 192.168.0.24 20
我遇到的问题是前瞻 (?=={75})
正在捕获 75 个等号的最后一个实例,而不是找到后向后的下一个实例。
使您的捕获组惰性化 (?
),这样它将匹配尽可能少的字符(在 ={75}
的第一个匹配处停止)
(?<=ce Metric)(?s)(.*?)(?=={75})
恕我直言,使用多行单行正则表达式会容易得多:
$regex =
@'
(?ms)IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
(.+?)
===========================================================================
'@
(Get-Content route_print.txt -Raw) -match $regex > $null
$Matches[1]
我正在尝试从遗留服务器的路由打印文件转储中提取信息并使用正则表达式对其进行解析。作为其中的一部分,我试图只提取 IPv4 路由信息。该文件看起来像这样...
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.1.1 192.168.0.24 20
===========================================================================
Persistent Routes:
None
IPv6 Route Table
===========================================================================
Active Routes:
If Metric Network Destination Gateway
1 306 ::1/128 On-link
===========================================================================
Persistent Routes:
None
我正在尝试使用 lookbehind/lookahead 方法 (?<=ce Metric)(?s)(.*)(?=={75})
来获取 IPv4 路由。
0.0.0.0 0.0.0.0 192.168.1.1 192.168.0.24 20
我遇到的问题是前瞻 (?=={75})
正在捕获 75 个等号的最后一个实例,而不是找到后向后的下一个实例。
使您的捕获组惰性化 (?
),这样它将匹配尽可能少的字符(在 ={75}
的第一个匹配处停止)
(?<=ce Metric)(?s)(.*?)(?=={75})
恕我直言,使用多行单行正则表达式会容易得多:
$regex =
@'
(?ms)IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
(.+?)
===========================================================================
'@
(Get-Content route_print.txt -Raw) -match $regex > $null
$Matches[1]