如果某個單詞存在于塊中的任何位置,我正在嘗試隔離一行塊。
例如,我有以下文字。
A1: blah blah
B1: blah blah foobar
A2: foobar blah blah
B2: blah blah foobar
C2: blah blah
D2: blah blah
A3: blah blah
B3: blah blah
C3: blah blah
塊可以包含任意數量的行,用空行分隔,我要查找的單詞foobar可以在塊中的任何位置這是唯一的常量,為了簡單起見,起始數字串列(A1,B1 等)是這些徹底改變。
這是我能想出的正則運算式。顯然,這不會隨著塊行大小的動態特性而調整。但至少這可以正常作業。
.*[\r\n] .*(foobar).*[\r\n] (.*[\n\r]){1}
Result:
A1: blah blah
B1: blah blah foobar
A2: foobar blah blah
B2: blah blah foobar
C2: blah blah
我能夠進一步完善正則運算式并提出以下內容:
(.\n?)*(foobar).*(\n?.)*
Result:
A1: blah blah
B1: blah blah foobar
A2: foobar blah blah
B2: blah blah foobar
C2: blah blah
D2: blah blah
正是我需要的,并且在我嘗試過的每個在線正則運算式測驗網站上都能完美運行。但是一旦我把它放在 Powershell 中,代碼就會吐出所有內容,沒有過濾任何內容。
這是我正在使用的代碼:
$regex = '(.\n?)*(foobar).*(\n?.)*'
$response = Invoke-RestMethod $url
$response | Select-String $regex -AllMatches | ForEach-Object {
foreach($foorbar in $_.matches.Value) {
$foobar | Out-File $fileOutput -Append
}
}
URL 包含帶有這些資料塊的網頁,僅此而已。一切都像新的正則運算式一樣被吐出,沒有任何決議,但舊的正則運算式按預期作業。所以我假設它的正則運算式有問題。
如果有人能指出這里有什么問題,非常感謝!
uj5u.com熱心網友回復:
你的正則運算式的原因
$regex = '(.\n?)*(foobar).*(\n?.)*'
不起作用的是,(\n?.)*如果存在回車符,則能夠跨空行匹配,因為.將匹配它。(Windows 使用 CRLF 行尾。)
出于同樣的原因,以 Wiktor 結尾的正則運算式(?:\n. )* 也不適用于 CRLF 行尾。
相反,您可以使用,例如
$regex = '(?:[^\r\n] \r?\n)*?.*foobar.*(?:\r?\n[^\r\n] )*'
這通過使用[^\r\n]而不是.匹配行上的至少一個字符而不是回車符或換行符(換行符)來避免該問題。
uj5u.com熱心網友回復:
您可以使用
$regex = '(?m)^(?:. \n)*?.*foobar.*(?:\n. )*'
請參閱正則運算式演示。 詳情:
(?m)- 一個RegexOptions.Multiline選項^- 任何行的開始(?:. \n)*?- 任何零個或多個(但盡可能少)非空行.*foobar.*- 一行包含foobar(?:\n. )*- 零個或多個(盡可能多)非空行。
在 PowerShell 中,您還可以使用
$regex = '(?m)^(?:. \n)*?.*foobar.*(?:\n. )*'
$response = Invoke-RestMethod $url
($response | Select-String -Pattern $regex -AllMatches | %{ $_.Matches.Value }) -join "`r`n`r`n" >> $fileOutput
uj5u.com熱心網友回復:
首先拆分輸入文本可以簡化解決方案:
$lf = [Environment]::NewLine
$response -split '\r?\n\r?\n' -match 'foobar' -join "$lf$lf" >>$fileOutput
$response -split '\r?\n\r?\n'在雙換行符(空行)上拆分文本。該模式\r?\n匹配單個換行符,適用于 Windows\r\n和 Unix\n風格。結果是一個文本塊陣列,洗掉了雙換行符。-match 'foobar'過濾文本塊陣列,僅生成包含“foobar”的這些塊。請注意,-match根據 LHS 運算元是單個字串還是字串陣列,運算子的作業方式會有所不同。在單個字串的情況下,結果將是一個boolean指示模式是否匹配的代替。- 使用
-join "$lf$lf"我們將匹配的文本塊再次連接成單個字串以產生所需的輸出。 - 最后,重定向運算子
>>將字串附加到輸出檔案(您也可以使用| Out-File -Append)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/496177.html
