javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > JS处理下划线

JS处理下划线的方法步骤

作者:满分观察网友z

本文主要介绍了使用JavaScript处理下划线,特别是在双引号内的下划线不作为分隔符的情况,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

🐌题目

使用下划线_作为分隔符进行切分。注:不能使用正则方式编写。

切分规则如下:

输入’ab_c_“abc_abc"abc"dddd”’

输出: [“ab”, “c”, “abc_abc”, “abc”, “dddd”]

🐙思路

一开始我也是想到用正则表达式,但是吧,题目既然说不能用,那我们就手写一个吧😅😅

实现思路

/**
 * 解析日志行,将日志行分割成多个元素,并以数组形式返回。
 *
 * @param logLine 日志行字符串
 * @returns 返回一个包含日志行中所有元素的数组
 */
function parseLogLine(logLine) {
  const result = [];
  let currentIndex = 0;
  let buffer = "";
  let inQuotes = false;
  // 循环遍历日志行中的每个字符
  while (currentIndex < logLine.length) {
    const char = logLine[currentIndex];
    if (char === "_") {
      // 如果遇到下划线且不在引号内,将buffer内容推入result并重置buffer。
      if (!inQuotes) {
        if (buffer) {
          // 检查buffer是否为空
          result.push(buffer);
          buffer = ""; // 重置buffer
        }
      } else {
        buffer += char; // 如果在引号内,则把下划线也加入buffer
      }
      // 如果遇到引号,切换inQuotes状态,
      // 并根据状态决定是否将buffer内容推入result并重置buffer。
    } else if (char === '"') {
      inQuotes = !inQuotes;
      if (!inQuotes && buffer) {
        // 检查buffer是否为空
        result.push(buffer);
        buffer = ""; // 重置buffer
      }
    } else {
      buffer += char; // 其他字符直接加入buffer
    }
    currentIndex++;
  }

  if (buffer) {
    // 处理日志行末尾的内容
    result.push(buffer);
  }

  return result;
}

// 测试示例数据
const logLine = 'ab_c_"abc_abc"_abc_"dddd"';
const parsed = parseLogLine(logLine);
console.log(parsed); // 输出: ["ab", "c", "abc_abc", "abc", "dddd"]

题目说不能用正则表达式,那如果是用正则表达式实现呢?

抱着好奇心,我试了一下,发现用正则虽然说代码没有自己手写那么多,但也挺难的。

function splitByUnderscoreIgnoringInQuotes(input) {
  // 匹配引号内的内容(包括引号)和引号外的内容(不包含下划线作为分隔符的部分)
  const regex = /"([^"]*)"|([^_"]+|_[^_"]*?(?=_|$))/g;
  let matches = [];
  let match;
  let result = [];

  // 使用正则找到所有匹配项
  while ((match = regex.exec(input)) !== null) {
    if (match[0].startsWith('"') && match[0].endsWith('"')) {
      // 引号内的内容直接加入结果,不做进一步处理
      matches.push(match[1]);
    } else {
      // 引号外的内容,可能是单独的非下划线字符,或者是以下划线分隔的多个部分
      // 我们需要将下划线分隔的部分进一步拆分
      matches = matches.concat(match[0].split(/_(?![^"]*"[^"]*")/));
    }
  }

  // 过滤空字符串,并合并引号内外的结果
  result = matches.filter(Boolean);

  return result;
}

// 测试输入
let input = 'ab_c_"abc_abc"_abc_"dddd"';
let output = splitByUnderscoreIgnoringInQuotes(input);
console.log(output); // 输出: ["ab", "c", "abc_abc", "abc", "dddd"]

🐚总结

这道题比较绕的是根据当前字符是双引号还是下划线,以及是否处于引号内,来决定是否分割当前段落。我们可以使用inQuotes的状态,当遇到双引号时,它会进行切换,根据状态进行筛选内容。

到此这篇关于JS处理下划线的方法步骤的文章就介绍到这了,更多相关JS处理下划线内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文