我正在嘗試使用正則運算式清理一些 html 檔案(是的,我看過這篇文章。我不想一般決議 html),我想洗掉所有不包含標簽的行。我的腳本如下:
Remove-Item $args[1]
$text = (Get-Content -Path $args[0] -Raw)
$text = $text -replace "^\s*\r?\n"
New-Item -Path $args[1] -ItemType File -Force -Value $text
還有很多其他的東西我想替換,但我主要是在嘗試修復
我可以驗證內部正則運算式是否有效:VSCode(使用 JS 正則運算式而不是 powershell 的 .NET 正則運算式)使用提供的正則運算式正確匹配(并替換)有問題的行。
我知道Powershell 是 Special,所以我已經將 的輸出轉換為Get-Content帶有嵌入換行符的原始字串。這沒有幫助。
我可以驗證其他函式(即remove-item和new-item)是否作業得很好,并且其他正則運算式可以通過將正則運算式文本從"^\s*\r?\n"to更改為"p", "abc"并查看p標簽都變成abc標簽來作業。
此外,正則運算式\s*\r?\n有效,所以并不是正則運算式找不到換行符。
正則運算式\A\s*\r?\n也不起作用,這意味著它與 PowerShell 如何找到字串的開始\結束有關。
這是怎么回事?
<p>This is some text</p>
(the next line has a bunch of spaces)
<p>this is some more text</p>
作為參考,當使用 VSCode 的 JS 正則運算式引擎時,我的正則運算式應該(并且確實)匹配上述示例的第二、第四和第五行(我相信類似 PCRE)
最后,對正則運算式進行反編譯:
^ from the start of the string
\s* match any number of whitespaces
\r? possibly followed by a carriage return
\n then a newline
uj5u.com熱心網友回復:
當你做
$text = (Get-Content -Path $args[0] -Raw)
你里面有行尾$text,你的正則運算式可以匹配它們。
該^錨可以匹配任何一行的開始,也然而,要使用一個特殊的標志:
$text = $text -replace '(?m)^\s*\n'
該\s模式涵蓋了回車,沒必要對他們和使用無憂\r?。
解釋
--------------------------------------------------------------------------------
(?m) set flags for this block (with ^ and $
matching start and end of line)
--------------------------------------------------------------------------------
^ the beginning of a "line"
--------------------------------------------------------------------------------
\s* whitespace (0 or
more times (matching the most amount
possible))
--------------------------------------------------------------------------------
\n '\n' (newline)
uj5u.com熱心網友回復:
Ryszard Czech 的有用回答很好地解釋了您的方法的問題,并提供了有效的解決方案。
本質上,您希望從檔案中消除空行或空白(全空白)行。
一種更簡單但速度較慢的解決方案是利用Get-Content的默認逐行流式傳輸,結合許多 PowerShell 運算子對輸入陣列進行操作的能力,在這種情況下,它們充當過濾器。
在這種情況下,您可以利用-match運算子(-Encoding根據需要進行調整):
@(Get-Content -Path $args[0]) -match '\S' | Set-Content -Encoding UTF8 $args[1]
以上將檔案$args[0]中包含至少一個非空白字符( \S) 的所有行傳遞到 to Set-Content,從而將過濾后的行保存到目標檔案$args[1]。
uj5u.com熱心網友回復:
訣竅是,您實際上可以匹配的行不會超過一條。
當您使用 將檔案轉換為字串時-Raw,您將其設為一行。^因此只會匹配檔案的開頭,因為這是正則運算式引擎可以找到的唯一字串開頭識別符號。
一種解決方法是匹配上一行末尾的換行符或匹配檔案的開頭,然后將其轉移到您的替換中,如下所示:
$text = $text -replace "(^|\n)\s*\r?\n","$1"
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/340855.html
