html - 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 搜索/替换为:
- 如果
<pre>...</pre>
存在,请替换<pre>...</pre>
为反引号,而不是<code>...</code>
. - 如果
<pre>...</pre>
不存在,请<code>...</code>
用反引号替换。
(如果我做错了,我会很感激知道。)
我走错了方向,因为我尝试过的任何正则表达式都不起作用。
^(?!.*?[</pre>]).*$<code.*?>(.*?)</code>
(无匹配)^((?!</pre>$).)*<code.*?>(.*?)</code>
(即使</pre>
存在也匹配)^(?!</pre>$).*<code.*?>(.*?)</code>
(即使</pre>
存在也匹配)- 等等。
谁能指出我正确的方向?感谢您的任何帮助。
(我知道有一些工具可以自动将 HTML 转换为 Markdown,并且正在使用其中一个 - 这只是基于我们特定输出中的不规则性的独特准备步骤。)
解决方案
@'
...
... <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 渲染中这些换行符可能会丢失)。.
`...`
(?:...)
构造是非捕获子表达式,对于出于逻辑原因需要的子表达式很有用,而无需稍后引用它们匹配的内容。
推荐阅读
- python - 如何将文本文件中的字符串转换为矩阵(python)
- python - 从列表中删除相同的链接但具有不同的 url
- python - 为什么将字符串传递给对象添加括号而其他参数没有括号?
- laravel - 如何在 laravel 8 中动态添加/删除页面?
- python - 如何创建一列字符串,包括另一列的值
- c++ - C++:有没有办法在使用 g++ 编译时直接传递系统参数/文件
- c# - 如何循环访问具有限制条件的邮箱?
- java - 有没有办法做 x++ 但操作更大的数字?
- sql - 如何在 Oracle SQL 中使用月份作为日期列
- javascript - javascript如何使用按钮动态添加元素以形成标签