js实现引号闭合
检查字符串中的引号是否闭合
在JavaScript中,可以通过遍历字符串并统计引号数量来判断引号是否闭合。以下是一种实现方法:
function areQuotesBalanced(str) {
let singleQuotes = 0;
let doubleQuotes = 0;
for (let i = 0; i < str.length; i++) {
const char = str[i];
if (char === "'" && (i === 0 || str[i-1] !== "\\")) {
singleQuotes++;
}
if (char === '"' && (i === 0 || str[i-1] !== "\\")) {
doubleQuotes++;
}
}
return singleQuotes % 2 === 0 && doubleQuotes % 2 === 0;
}
处理转义引号的情况
上面的代码考虑了转义引号的情况(如\'或\"不会被计入)。如果需要更严格地处理转义字符,可以修改判断条件:
function isEscaped(str, index) {
let backslashCount = 0;
while (index > 0 && str[--index] === '\\') {
backslashCount++;
}
return backslashCount % 2 !== 0;
}
function areQuotesBalancedWithEscape(str) {
let singleQuotes = 0;
let doubleQuotes = 0;
for (let i = 0; i < str.length; i++) {
const char = str[i];
if (char === "'" && !isEscaped(str, i)) {
singleQuotes++;
}
if (char === '"' && !isEscaped(str, i)) {
doubleQuotes++;
}
}
return singleQuotes % 2 === 0 && doubleQuotes % 2 === 0;
}
使用栈数据结构处理嵌套引号
如果需要处理更复杂的嵌套情况(如在模板字符串中),可以使用栈数据结构:
function areQuotesNestedCorrectly(str) {
const stack = [];
const quotePairs = {
"'": "'",
'"': '"',
'`': '`'
};
for (let i = 0; i < str.length; i++) {
const char = str[i];
// 检查是否是转义字符
if (char === '\\') {
i++; // 跳过下一个字符
continue;
}
// 如果是开引号
if (quotePairs[char]) {
if (stack.length > 0 && stack[stack.length-1] === char) {
stack.pop(); // 匹配到闭引号
} else {
stack.push(char); // 新的开引号
}
}
}
return stack.length === 0;
}
正则表达式方法
对于简单的情况,可以使用正则表达式快速检查:

function areQuotesBalancedRegex(str) {
const singleQuoteRegex = /(^|[^\\])'(.*?(\\.[^']*)*)'/g;
const doubleQuoteRegex = /(^|[^\\])"(.*?(\\.[^"]*)*)"/g;
const singleQuotes = (str.match(/'/g) || []).length;
const doubleQuotes = (str.match(/"/g) || []).length;
return singleQuotes % 2 === 0 && doubleQuotes % 2 === 0;
}
注意:正则表达式方法可能无法处理所有边缘情况,特别是复杂的嵌套和转义场景。






