引言
最近开发 markdown 编辑器 解析正则表达式 匹配文本定位 功能,踩了不少的坑,现在总结一下:
变量和字面量的区分let a = 10
a是变量 ,10是字面量
- 为什么
console.log("Hello\nWorld")
能输出换行? 答:(字面量输出时候自动转义) - 而
console.log(userInput)
(用户输入\n
)却原样显示?答:(用户交互输入,输出时不进行转义) - 为什么String.raw
Hello\nworld
不会被转义?答:(String.raw定义的是原始字符串,输出的时候不会被转义)? - 为什么文件读取的
\t
不会自动变成制表符?答:(文件读取,输出时候不转义)
转义字符的本质
什么是转义字符?
转义字符是以反斜杠(\
)开头的特殊序列,用于表示:
- 不可见字符 (如
\n
换行、\t
制表符) - 特殊符号 (如
\"
避免字符串终止) - Unicode 编码 (如
\u2022
表示 •)
转义字符的分类
类型 | 示例 | 作用 |
---|---|---|
控制字符 | \n , \t |
格式化文本(换行、缩进) |
特殊符号 | \\ , \" |
表示字符本身(如路径 C:\\ ) |
编码字符 | \u0041 |
表示 Unicode 字符(A) |
转义字符的处理时机
代码中的字符串字面量(自动转义)
当你在代码中直接 编写字符串 时,转义字符会在代码解析阶段被处理。
javascript
// JavaScript
console.log("Hello\nWorld"); // \n 被转义为换行符
规则:
- 编译器/解释器会立即解析转义字符。
- 适用于硬编码的字符串。
原始字符串(禁用转义)
通过原始字符串语法,可以完全禁用转义:
javascript
// JavaScript 这里\n没有被解析,保持原样
console.log(String.raw`Hello\nWorld`); // 输出 Hello\nWorld
适用场景:
- 正则表达式(避免双重转义)
- 文件路径(如
C:\Windows
)
用户输入与动态字符串(不自动转义)
用户输入 (如 <input>
、prompt()
)和动态拼接的字符串不会自动转义:
javascript
const userInput = prompt("输入内容"); // 用户输入 \t
console.log(userInput); // 输出 \t(两个字符:\ 和 t)
为什么会这样?
- 输入框和动态字符串按原始文本处理,不会进行转移处理
- 如果需要转义,必须手动解析。
手动解析转义字符的方法
将 \n
转为真实换行符
javascript
const userInput = "Hello\nWorld"; // 用户输入的原始字符串
const parsed = JSON.parse(`"${userInput}"`); // 解析转义字符
console.log(parsed); // 输出换行后的内容
显示转义形式(如 \n
→ \\n
)
javascript
const rawText = "Hello\nWorld";
const escaped = rawText.replace(/\n/g, "\n");
console.log(escaped); // 输出 "Hello\nWorld"
正则表达式的双重转义
这里字符串\\d+
会被先转义为\d+
,然后正则表达式解析\d+
javascript
const userPattern = "\\d+"; // 注意是两个\\,
const regex = new RegExp(userPattern); // 实际解析为 \d+
常见场景与解决方案
表单输入处理(Vue/React示例)
vue
<template>
<input v-model="userInput" placeholder="输入 \n 或 \t">
<div>{{ parsedInput }}</div>
</template>
<script>
export default {
data() { return { userInput: "" }; },
computed: {
parsedInput() {
try {
return JSON.parse(`"${this.userInput}"`); // 解析转义字符
} catch {
return this.userInput; // 失败时回退原始输入
}
}
}
};
</script>
文件读取与转义
javascript
// Node.js 读取文件
const fs = require("fs");
const text = fs.readFileSync("data.txt", "utf8"); // 文本中的 \n 是字面量
const parsedText = JSON.parse(`"${text}"`); // 手动转义
五、总结:转义字符处理规则
场景 | 是否自动转义 | 处理方法 |
---|---|---|
字符串字面量 | ✅ 是 | 直接使用 \n 、\t |
原始字符串 | ❌ 否 | 用 r"" 或 String.raw |
用户输入 | ❌ 否 | 手动解析(JSON.parse ) |
正则表达式 | 视情况而定 | 字面量用 \d ,字符串用 \\d |
文件/网络数据 | ❌ 否 | 按需手动解析 |
- 代码中的字面量:自动转义。
- 运行时动态内容:默认不转义,需手动处理。
- 用户输入/文件:永远视为原始字符串。