簡體   English   中英

如何捕獲每一行的第二場比賽?

[英]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

我猜想,也許是類似的表達,

(?<=\\)[^\\]*(?=\\[A-Z0-9]{40}$)

可能是一種選擇。

演示1

也許只是

[^\\]*(?=\\[A-Z0-9]{40}$)

要么

[^\\]*(?=\\[A-F0-9]{40}$)

會簡單地返回Root ,而[A-F0-9]結束子字符串的長度為40。 對於更靈活的量詞,此表達式可能有效:

[^\\]*(?=\\[A-F0-9]*$)

演示2

您可以使用錨^來聲明字符串的開頭。 重復兩次匹配,而不是反斜杠或換行符,然后再加上反斜杠。

使用捕獲組來匹配以下內容;

^[^\\\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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM