Markdown 标题转换
snippetjs正则负向先行断言

Markdown 标题转换

简单的脚本示例,它将 Markdown 文件中的所有一级标题(# 开头)转换为二级标题(## 开头),依此类推。定义了一个正则表达式headingsRegex,用来匹配Markdown中的标题。正则表...

花野猫

花野猫

更新于 2024-08-08

2001

简单的脚本示例,它将 Markdown 文件中的所有一级标题(# 开头)转换为二级标题(## 开头),依此类推。

  • 定义了一个正则表达式headingsRegex,用来匹配Markdown中的标题。正则表达式中的(^#{1,6})匹配从一级到六级的标题,\s*匹配标题后的空白字符,(.*)匹配标题内容。
  • replaceHeading函数接收匹配到的标题,计算其级别,并生成新的标题前缀,然后返回新的标题。
  • 使用String.prototype.replace方法和定义的替换函数来替换Markdown文本中的所有标题。

请注意,这个脚本是一个简单的示例,它假设Markdown文本格式良好,并且没有考虑嵌套标题或其他复杂情况。在实际使用中可能需要根据具体情况调整正则表达式和替换逻辑。

javascript
// 假设 markdownText 是你的Markdown文本内容
let markdownText = `# 这是一级标题
一些文本内容...
## 这是二级标题
一些文本内容...
### 这是三级标题
一些文本内容...
`;
// 使用正则表达式匹配所有的Markdown标题
const headingsRegex = /(^#{1,6})\s+(.*)/gm;
// 替换函数,将匹配到的标题提升一个级别
function replaceHeading(match, prefix, content) {
const level = prefix.length;
const newPrefix = '#'.repeat(level + 1);
return `${newPrefix} ${content}`;
}
// 替换Markdown文本中的所有标题
markdownText = markdownText.replace(headingsRegex, replaceHeading);
console.log(markdownText);

一种创建 n 个元素数组的方法

使用 String.prototype.repeat ,创建字符串,再分割为数组。其实写起来跟用 Array.from 也差不多,不会节省多少代码

js
`1`.repeat(10).split("");
js
Array.from({length:10});

负向先行断言

使用负向先行断言(negative lookahead)可以实现匹配以#开头但#前面不能有空格的Markdown标题。负向先行断言的语法是 (?!...),其中...是我们要排除的模式。

下面是使用负向先行断言的正则表达式,用于匹配Markdown标题:

^(?!\s)(#{1,6})(.*)

这个正则表达式的组成部分解释如下:

  • ^ 表示行的开始。
  • (?!\s) 是负向先行断言,表示#前面不能有空格字符。
  • (#{1,6}) 表示匹配1到6个#字符,对应Markdown中的一级到六级标题。
  • (.*) 表示匹配任意数量的任意字符,直到行尾。

在Node.js中使用这个正则表达式来匹配Markdown文件中的标题:

javascript
const fs = require('fs');
const path = require('path');
// 使用负向先行断言的正则表达式匹配Markdown标题
const headerRegex = /^?!\s)(#{1,6})(.*)$/gm;
// 读取Markdown文件内容
const markdownFilePath = path.join(__dirname, 'path/to/your/markdown.md');
fs.readFile(markdownFilePath, 'utf8', (err, markdownContent) => {
if (err) {
console.error('Error reading file:', err);
return;
}
// 使用正则表达式匹配所有标题
const headers = markdownContent.match(headerRegex);
if (headers) {
headers.forEach((header, index) => {
// 移除行首的#和空格,获取标题文本
const trimmedHeader = header.replace(/^(#+)[ \t]?/, '');
console.log(`Title ${index + 1}: ${trimmedHeader}`);
});
} else {
console.log('No headers found.');
}
});

请注意,在JavaScript中,正则表达式的某些字符需要被转义,例如括号()和感叹号!。在上面的代码中,我使用了(?!\s)来转义这些字符。然而,实际上在JavaScript正则表达式中,你只需要使用(?!\s)即可,不需要额外的转义。

'path/to/your/markdown.md'替换为你的Markdown文件的实际路径。这段代码会读取Markdown文件,使用正则表达式匹配所有符合要求的标题,并打印出它们的文本内容。