JS處理下劃線的方法步驟
??題目
使用下劃線_
作為分隔符進(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)文章
JavaScript獲取當(dāng)前時(shí)間向前推三個(gè)月的方法示例
這篇文章主要介紹了JavaScript獲取當(dāng)前時(shí)間向前推三個(gè)月的方法,結(jié)合實(shí)例形式分析了javascript日期與時(shí)間運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-02-02抽出www.templatemonster.com的鼠標(biāo)懸停加載大圖模板的代碼
抽出www.templatemonster.com的鼠標(biāo)懸停加載大圖模板的代碼...2007-07-07javascript自動(dòng)給文本url地址增加鏈接的方法分享
這篇文章主要介紹了javascript自動(dòng)給文本url地址增加鏈接的方法,有需要的朋友可以參考一下2014-01-01頁面js遇到亂碼問題的解決方法是和無法轉(zhuǎn)碼的情況
在老項(xiàng)目里加些js文件和老項(xiàng)目的編碼格式不一致出現(xiàn)亂碼,由于兩個(gè)文件都不能轉(zhuǎn)格式,于是百度個(gè)不錯(cuò)的方法在此與大家分享下2014-04-04