[英]How do I capture the 2nd match for each line?
基本上,我需要匹配每行1個,但是現在,我的正則表達式匹配每行2個。
https://regex101.com/r/KmgGwS/8
我的正則表達式正在尋找2個斜杠,它返回之間的字符串,但問題是我的路徑有多個斜杠,我只需要將其與每行第二個匹配項匹配
(?<=\\).*?(?=\\)
這是我的PowerShell代碼:
if ( $_.PSPath -match ("(?<=::).*?(?=\\)")) {
$user = $matches.Values
}
例如:
Microsoft.PowerShell.Security\Certificate::CurrentUser\Root\CDD4EEAE6000AC7F40C3802C171E30148030C072 Microsoft.PowerShell.Security\Certificate::CurrentUser\Root\BE36A4562FB2EE05DBB3D32323ADF445084ED656
我的代碼所做的就是得到了
Certificate::CurrentUserRoot Certificate::CurrentUserRoot
但是我真正需要的是將字符串添加到第二個匹配\\ ___ \\,即:
Root Root
您可以使用錨^
來聲明字符串的開頭。 重復兩次匹配,而不是反斜杠或換行符,然后再加上反斜杠。
使用捕獲組來匹配以下內容;
^[^\\\r\n]*\\[^\\\r\n]*\\([^\\\r\n]+)
關於圖案
^
字符串開頭 [^\\\\\\r\\n]*\\\\[^\\\\\\r\\n]*\\\\
匹配2次而不是\\
或換行符,然后\\
(
捕獲組1
[^\\\\\\r\\n]+
匹配1+次以上而不是\\
或換行符 )
關閉第1組 該值在第一個捕獲組中:
$user = $matches[1]
如果您只想讓匹配項使用腳本而不是組1,則可以使用正向后方斷言左邊的2倍不是\\
然后是\\
(?<=^[^\\\r\n]*\\[^\\\r\n]*\\)[^\\\r\n]+
要使用PowerShell的-split
運算符提供實用的替代方案:
PS> 'Microsoft.PowerShell.Security\Certificate::CurrentUser\Root\CDD4EEAE6000AC7F40C3802C171E30148030C072',
'Microsoft.PowerShell.Security\Certificate::CurrentUser\Root\BE36A4562FB2EE05DBB3D32323ADF445084ED656' |
ForEach-Object { ($_ -split '[::|\\]')[4] }
Root
Root
上面用分隔符\\
或::
標記每個輸入字符串,並提取第四個標記。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.