首页 > 解决方案 > PowerShell Regex - 匹配不包含不同字符串的字符串

问题描述

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

PowerShell 脚本包括以下几行:

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

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

因为 Markdown 将由单个反引号 (`) 包围的文本解释为出于文体目的的“代码”,所以我希望 PowerShell 搜索/替换为:

(如果我做错了,我会很感激知道。)

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

谁能指出我正确的方向?感谢您的任何帮助。

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

标签: htmlregexpowershellmarkdown

解决方案


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

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

以上产生:

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

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


推荐阅读