Jak*_*ern 3 html regex powershell
我正在尝试使用正则表达式清理一些 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
Run Code Online (Sandbox Code Playgroud)
我想更换很多其他东西,但我主要是在尝试修复
我可以验证内部正则表达式是否有效: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 如何查找字符串的开头\结尾有关。
这是怎么回事?
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
Run Code Online (Sandbox Code Playgroud)
作为参考,当使用 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
Run Code Online (Sandbox Code Playgroud)
当你这样做时
$text = (Get-Content -Path $args[0] -Raw)
Run Code Online (Sandbox Code Playgroud)
你里面有行结尾$text,你的正则表达式可以匹配它们。
锚点^也可以匹配任何行的开头,但是,需要使用一个特殊的标志:
$text = $text -replace '(?m)^\s*\n'
Run Code Online (Sandbox Code Playgroud)
该\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)
Run Code Online (Sandbox Code Playgroud)