PowerShell 正则表达式 - 匹配不包含不同字符串的字符串

PowerShell Regex - match a string that does not include a different string

目标是准备一个 HTML 文件以使用 PowerShell 转换为 Markdown。

PowerShell 脚本包括这些行:

-replace '<pre.*?>(.*?)</pre>', '``'`
-replace '<code.*?>(.*?)</code>', '`<b></b>`'`

有时 HTML 包括 text <pre><code>text</code></pre> text。有时它只包括 text <code>/text</code> text.

因为 Markdown 将单反引号 (`) 包围的文本解释为出于文体目的的“代码”,我希望 PowerShell search/replace 为:

(如果我做错了,我将不胜感激。)

我走错了方向,因为我试过的正则表达式都不起作用。

任何人都可以指出我正确的方向吗?感谢您的帮助。

(我知道有一些工具可以自动将 HTML 转换为 Markdown,我正在使用一个 - 这只是基于我们特定输出中的不规则性的独特准备步骤。)

@'
...
... <pre><code>bingo</code></pre> ...
... <code>bongo</code> ...
...
'@ -replace '(?s)(?:(?:<pre>\s*)?<code>)(.*?)(?:</code>(?:\s*</pre>)?)', '``'

注意:为简洁起见,我假设 opening <pre><code> 标签既不包含属性也不包含结束 > 之前的空格,并且类似地,closing 标签在结束 > 之前不包含空格。像这样的可变性使得使用 专用 HTML 解析器 而不是正则表达式通常更可取。

以上结果:

...
... `bingo` ...
... `bongo` ...
...
  • (?s) 是使 . 也匹配 newlinesSingleLine 内联正则表达式选项(如果值包含在 `...` 中跨越多行 - 但请注意,在以后的 Markdown 渲染中,这些换行符可能会丢失)。

  • (?:...) 构造是 捕获子表达式,对于 逻辑 所需的子表达式很有用原因,而无需稍后引用它们匹配的内容。