首页 > 解决方案 > 正则表达式:类似 Slack 的“markdown”,用于精确匹配一个格式字符

问题描述

我已经尝试对此进行研究,但只能弄清楚如何使我的搜索词如此精确。

我希望用户能够用符号、_*~等围绕文本进行类似降价的格式设置,基本上就是 Slack 的做法。我让它工作得很好,但我有一个问题。

当用户键入_bold_时,我会渲染<strong>bold</strong>,这是想要的效果。但是当用户键入时__bold__,我<strong>_bold_</strong>宁愿直接得到__bold__

这是我的正则表达式:

const rules = [
    {regex: /_{1}(.+?)_{1}/g, replacement: '<em>$1</em>'},
    {regex: /\*{1}(.+?)\*{1}/g, replacement: '<strong>$1</strong>'},
    // etc
];

然后我运行:

let formattedText = '__some text__'; // the user input
rules.forEach(rule => formattedText = formattedText.replace(rule.regex, rule.replacement));

它只匹配带有 的那个{1}。但是我如何让它忽略有多个的情况呢?

标签: javascriptregexformattingmarkdown

解决方案


您可以使用

{regex: /(^|[^_])_(?!_)((?:[^]*?[^_])?)_(?!_)/g, replacement: '$1<em>$2</em>'}

请参阅正则表达式演示

细节

  • (^|[^_])- 第 1 组(从替换模式中引用 with $1,因为此文本应放回结果中):字符串开头或除此之外的任何字符_
  • _(?!_)- a_不跟随_
  • ((?:[^]*?[^_])?)- 第 2 组(参考替换模式中的 with):任何$20+个字符[^]*?*?_
  • _(?!_)- a_不跟随_

推荐阅读