用于VS Code扩展的JavaScript自定义文本块匹配正则求助
可直接用于VS Code扩展的文本块匹配正则实现
核心正则表达式
/@(\w+)\s*\n([\s\S]*?)^\1$/gm
逐段匹配逻辑(完全对应给定的文本块规则)
@(\w+):匹配块起始的自定义标签,将标签名存入第1个捕获组,对应「@符号紧跟任意\w字符组成的自定义标签」的规则\s*\n:匹配起始标签后的任意空白字符与换行符,兼容标签后带空格、制表符再换行的常见编码场景([\s\S]*?):非贪婪匹配块内所有内容(包括换行、任意ASCII字符),非贪婪模式保证不会吞掉后续独立的文本块^\1$:在多行模式下匹配独立成行的、与起始标签完全一致的结束标记,严格要求该行没有其他修饰内容- 正则标志说明:
g:全局匹配单文档中所有符合规则的文本块m:开启多行模式,让行首^、行尾$匹配每一行的边界而非整个文档的边界,实现独立成行的判断校验
常见踩坑规避
- 不要用
.匹配跨行内容:默认情况下.无法匹配换行符,会导致多行文本块匹配中断,用[\s\S]可兼容所有内容字符,同时兼容老版本JS引擎 - 不要用贪婪匹配:如果把
*?改成*,正则会从第一个起始标签直接匹配到文档最后一个结束标签,把多个相邻文本块合并成一个错误的大匹配 - 不要漏加
m标志:漏加后^\1$只会匹配整个文档的开头和结尾,完全无法识别独立成行的结束标签
实际运行示例
const sampleDoc = `string text = @text 这是文本块内容,支持输入大段文本并赋值给变量,起始标签由开发者自定义 可包含任意多行换行的普通内容 text ; string text2 = @text 第二个文本块的内容 text ;`; const blockRegex = /@(\w+)\s*\n([\s\S]*?)^\1$/gm; let match; // 遍历所有匹配结果 while ((match = blockRegex.exec(sampleDoc)) !== null) { console.log('匹配到的文本块信息:', { 自定义标签名: match[1], 块内内容: match[2].trim(), 匹配起始位置: match.index, 匹配结束位置: blockRegex.lastIndex }) }
该实现可直接接入VS Code扩展的语法高亮、语义分析模块,无外部依赖,完全兼容VS Code内置的JS正则引擎。
内容的提问来源于stack exchange,提问作者the_gesslar
相关产品推荐
相关产品推荐

