欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS處理下劃線的方法步驟

 更新時(shí)間:2025年01月09日 15:41:46   作者:滿分觀察網(wǎng)友z  
本文主要介紹了使用JavaScript處理下劃線,特別是在雙引號(hào)內(nèi)的下劃線不作為分隔符的情況,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

??題目

使用下劃線_作為分隔符進(jìn)行切分。注:不能使用正則方式編寫。

切分規(guī)則如下:

  • 下劃線在雙引號(hào)內(nèi)時(shí)被視為普通字符
  • 下劃線在雙引號(hào)外是分隔符

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

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

??思路

一開始我也是想到用正則表達(dá)式,但是吧,題目既然說不能用,那我們就手寫一個(gè)吧????

實(shí)現(xiàn)思路

  • 記錄當(dāng)前字符位置、緩存內(nèi)容和設(shè)置標(biāo)記判斷是否在引號(hào)內(nèi)。
  • 使用while循環(huán)遍歷日志行中的每個(gè)字符。
  • 如果遇到下劃線且不在引號(hào)內(nèi),將緩存的內(nèi)容推入新數(shù)組并重置緩存的內(nèi)容。
  • 如果遇到引號(hào),切換標(biāo)記的狀態(tài),并根據(jù)狀態(tài)決定是否進(jìn)行3操作。
  • 對(duì)于其他字符,直接添加到緩存的內(nèi)容中。
  • 循環(huán)結(jié)束后,檢查緩存的內(nèi)容是否有剩余內(nèi)容,并將其推入數(shù)組。
/**
 * 解析日志行,將日志行分割成多個(gè)元素,并以數(shù)組形式返回。
 *
 * @param logLine 日志行字符串
 * @returns 返回一個(gè)包含日志行中所有元素的數(shù)組
 */
function parseLogLine(logLine) {
  const result = [];
  let currentIndex = 0;
  let buffer = "";
  let inQuotes = false;
  // 循環(huán)遍歷日志行中的每個(gè)字符
  while (currentIndex < logLine.length) {
    const char = logLine[currentIndex];
    if (char === "_") {
      // 如果遇到下劃線且不在引號(hào)內(nèi),將buffer內(nèi)容推入result并重置buffer。
      if (!inQuotes) {
        if (buffer) {
          // 檢查buffer是否為空
          result.push(buffer);
          buffer = ""; // 重置buffer
        }
      } else {
        buffer += char; // 如果在引號(hào)內(nèi),則把下劃線也加入buffer
      }
      // 如果遇到引號(hào),切換inQuotes狀態(tài),
      // 并根據(jù)狀態(tài)決定是否將buffer內(nèi)容推入result并重置buffer。
    } else if (char === '"') {
      inQuotes = !inQuotes;
      if (!inQuotes && buffer) {
        // 檢查buffer是否為空
        result.push(buffer);
        buffer = ""; // 重置buffer
      }
    } else {
      buffer += char; // 其他字符直接加入buffer
    }
    currentIndex++;
  }

  if (buffer) {
    // 處理日志行末尾的內(nèi)容
    result.push(buffer);
  }

  return result;
}

// 測(cè)試示例數(shù)據(jù)
const logLine = 'ab_c_"abc_abc"_abc_"dddd"';
const parsed = parseLogLine(logLine);
console.log(parsed); // 輸出: ["ab", "c", "abc_abc", "abc", "dddd"]

題目說不能用正則表達(dá)式,那如果是用正則表達(dá)式實(shí)現(xiàn)呢?

抱著好奇心,我試了一下,發(fā)現(xiàn)用正則雖然說代碼沒有自己手寫那么多,但也挺難的。

function splitByUnderscoreIgnoringInQuotes(input) {
  // 匹配引號(hào)內(nèi)的內(nèi)容(包括引號(hào))和引號(hào)外的內(nèi)容(不包含下劃線作為分隔符的部分)
  const regex = /"([^"]*)"|([^_"]+|_[^_"]*?(?=_|$))/g;
  let matches = [];
  let match;
  let result = [];

  // 使用正則找到所有匹配項(xiàng)
  while ((match = regex.exec(input)) !== null) {
    if (match[0].startsWith('"') && match[0].endsWith('"')) {
      // 引號(hào)內(nèi)的內(nèi)容直接加入結(jié)果,不做進(jìn)一步處理
      matches.push(match[1]);
    } else {
      // 引號(hào)外的內(nèi)容,可能是單獨(dú)的非下劃線字符,或者是以下劃線分隔的多個(gè)部分
      // 我們需要將下劃線分隔的部分進(jìn)一步拆分
      matches = matches.concat(match[0].split(/_(?![^"]*"[^"]*")/));
    }
  }

  // 過濾空字符串,并合并引號(hào)內(nèi)外的結(jié)果
  result = matches.filter(Boolean);

  return result;
}

// 測(cè)試輸入
let input = 'ab_c_"abc_abc"_abc_"dddd"';
let output = splitByUnderscoreIgnoringInQuotes(input);
console.log(output); // 輸出: ["ab", "c", "abc_abc", "abc", "dddd"]

??總結(jié)

這道題比較繞的是根據(jù)當(dāng)前字符是雙引號(hào)還是下劃線,以及是否處于引號(hào)內(nèi),來決定是否分割當(dāng)前段落。我們可以使用inQuotes的狀態(tài),當(dāng)遇到雙引號(hào)時(shí),它會(huì)進(jìn)行切換,根據(jù)狀態(tài)進(jìn)行篩選內(nèi)容。

到此這篇關(guān)于JS處理下劃線的方法步驟的文章就介紹到這了,更多相關(guān)JS處理下劃線內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論