javascript - 正则表达式:类似 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}
。但是我如何让它忽略有多个的情况呢?
解决方案
您可以使用
{regex: /(^|[^_])_(?!_)((?:[^]*?[^_])?)_(?!_)/g, replacement: '$1<em>$2</em>'}
请参阅正则表达式演示。
细节
(^|[^_])
- 第 1 组(从替换模式中引用 with$1
,因为此文本应放回结果中):字符串开头或除此之外的任何字符_
_(?!_)
- a_
不跟随_
((?:[^]*?[^_])?)
- 第 2 组(参考替换模式中的 with):任何$2
0+个字符[^]*?
(*?
_
_(?!_)
- a_
不跟随_
推荐阅读
- python - 如何从 QCalendarWidget 对象获取日期并将其设置为最小日期?
- sql - 使用 case 语句检查 SQL 表中是否存在记录
- c# - InvalidDataException:超过多部分正文长度限制 16384
- python - API 网关主体映射移动?
- jestjs - toEqual 的变体,它使用类属性的方式与使用类方法的方式相同
- php - 当别名域是请求的资源时捕获请求的 URL
- go - 使用事务运行 Go 测试
- c++ - 在运行时访问 C++17 中元组的随机子集
- terraform - 如何让 ECS 服务进行强制重新部署?
- java - 如何使用 Java 在 YouTube Data API v3 中设置 nextPageToken?