gpt4 book ai didi

javascript - JavaScript 的正则表达式 : Replace a particular submatch group with something

转载 作者:行者123 更新时间:2023-11-28 03:40:21 25 4
gpt4 key购买 nike

这是我的情况。我想识别链接的 Markdown(在这种情况下,只有一种特定样式的链接很好,它是这种格式: [link text](url "optional title") ,我想要做的是将此 Markdown 文本放入 <pre> 标签中url 适本地包装在 <a> 标签中。

一个伪例子:

转换

[link text](url "optional title")

[link text](<a href='url'>url</a> "optional title")

所以我挖出了 Markdown 解析器使用的正则表达式,它是这样的:

/*
text = text.replace(/
( // wrap whole match in $1
\[
(
(?:
\[[^\]]*\] // allow brackets nested one level
|
[^\[\]] // or anything else
)*
)
\]
\( // literal paren
[ \t]*
() // no id, so leave $3 empty
<?( // href = $4
(?:
\([^)]*\) // allow one level of (correctly nested) parens (think MSDN)
|
[^()\s]
)*?
)>?
[ \t]*
( // $5
(['"]) // quote char = $6
(.*?) // Title = $7
\6 // matching quote
[ \t]* // ignore any spaces/tabs between closing quote and )
)? // title is optional
\)
)
/g, writeAnchorTag);
*/

text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()<?((?:\([^)]*\)|[^()\s])*?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writeAnchorTag);

很好的评论中的分割有助于了解发生了什么,显然我需要做的就是替换 $4子匹配 <a href='$4'>$4</a> .

但我当然不能只做 str.replace(re,"<a href='$4'>$4</a>");因为那会用普通链接替换我的整个 Markdown 链接标记(包括链接文本和可选标题)。我希望普通链接显示在原始 Markdown 中,这样它看起来仍然像 <pre> 中的原始 Markdown。 (但现在有一个可点击的链接)。

那么,让我们看看...

摘录 $4 :

var group_4 = str.replace(re, "$4"); // Does anybody know a more efficient way to do this? I'm not trying to replace I just need to get the 4th group

好吧,我被卡住了,因为我想坚持 "<a href='"+group_4+"'>"+group_4+"</a>"作为 $4 的替代品.

有人给我提示吗?我很确定这是可以做到的,而且我怀疑它也可以优雅地完成。

我已经找到了一个潜在的解决方案(这是错误的),它是去除组 $4 之外的正则表达式部分.我认为这还不够,因为它不会根据链接内容进行任何实际的链接检测(即,您可以使用根本不是真实链接的内容来定义 Markdown 链接)。所以我应该使用原始的正则表达式,以确保我正在转换成 <a> 的内容。实际上是(Markdown 内联样式)链接的一部分。

最佳答案

我想我有办法利用我已知的知识来解决这个问题。只需更换原装零件即可。这意味着 $4 之前和之后必须有其他子匹配覆盖整个表达式。 .假设有一个组$x包含从开始到 $4 的匹配项和另一组$y包含 $4 末尾的匹配项到字符串的末尾,我所要做的就是 str.replace(re,"$x<a href='$4'>$4</a>$y")并完成它。

现在看看是否可以修改我们的正则表达式以在向我提供这些组时不更改其接受的语言。

更新:再看一会儿它实际上很基础:

str.replace(re,"[$2]($4 $5)")

让我完成了 99% 的完全复制原始输入的方法,唯一不正确的部分是 $4 之间的空间。和 $5在输入中是 [ \t]*所以我所要做的就是将其包装到原始正则表达式中的一个新组中。我相信它会变成$5所以它将是:

/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()<?((?:\([^)]*\)|[^()\s])*?)>?([ \t]*)((['"])(.*?)\6[ \t]*)?\))/g
^ ^

下面一行中的克拉表示添加括号的位置。

str.replace(re,"[$2]($4$5$6)")

应该产生准确的原件,所以

str.replace(re,"[$2](<a href='$4'>$4</a>$5$6)")

应该这样做。

现在剩下的就是设计一种方法来仅转义这些链接结构之外的 HTML,因为我不想转义 anchor 标记。嗯。

关于javascript - JavaScript 的正则表达式 : Replace a particular submatch group with something,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11404013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com