【问题标题】:PowerShell Regex - match a string that does not include a different stringPowerShell Regex - 匹配不包含不同字符串的字符串
【发布时间】:2021-06-02 13:58:39
【问题描述】:

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

PowerShell 脚本包括以下几行:

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

有时 HTML 包含text &lt;pre&gt;&lt;code&gt;text&lt;/code&gt;&lt;/pre&gt; text。有时它只包含text &lt;code&gt;/text&lt;/code&gt; text

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

  • 如果存在&lt;pre&gt;...&lt;/pre&gt;,请将&lt;pre&gt;...&lt;/pre&gt; 替换为反引号,而不是&lt;code&gt;...&lt;/code&gt;
  • 如果&lt;pre&gt;...&lt;/pre&gt; 不存在,请将&lt;code&gt;...&lt;/code&gt; 替换为反引号。

(如果我做错了,我会很高兴知道。)

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

  • ^(?!.*?[&lt;/pre&gt;]).*$&lt;code.*?&gt;(.*?)&lt;/code&gt;(没有匹配)
  • ^((?!&lt;/pre&gt;$).)*&lt;code.*?&gt;(.*?)&lt;/code&gt;(即使存在 &lt;/pre&gt; 也匹配)
  • ^(?!&lt;/pre&gt;$).*&lt;code.*?&gt;(.*?)&lt;/code&gt;(即使存在 &lt;/pre&gt; 也匹配)

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

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

【问题讨论】:

    标签: html regex powershell markdown


    【解决方案1】:
    @'
    ...
    ... <pre><code>bingo</code></pre> ...
    ... <code>bongo</code> ...
    ...
    '@ -replace '(?s)(?:(?:<pre>\s*)?<code>)(.*?)(?:</code>(?:\s*</pre>)?)', '`$1`'
    

    注意:为简洁起见,我假设 开头 &lt;pre&gt;&lt;code&gt; 标记在关闭 &gt; 之前既不包含属性也不包含空格,并且类似地,关闭标签在关闭&gt;之前不包含空格。正是这种可变性使得使用专用 HTML 解析器而不是正则表达式通常更可取。

    以上产量:

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-22
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 2020-11-13
      • 2019-04-24
      • 2019-06-05
      • 2012-06-13
      • 2020-12-25
      相关资源
      最近更新 更多