我在學習時正在抓取網頁作為一個有趣的小專案puppeteer,在那段時間里,我在清理字串以獲取有用資料時遇到了一些問題。我想出了一些簡單的方法來從他們那里提取我想要的資料,但是我遇到了一些我不知道處理事情的最佳方法的邊緣情況。
拿這個字串
Round 1 - Foo Bar (SchoolName) over John (JC) Cena (Fake School Name) (Fall 1:19)
我想得到的資料。
- 獲獎者姓名 = Foo Bar
- 獲獎學校 = (學校名稱)
- 失敗者的名字=約翰塞納
- 失敗者的學校=假學校名稱
Round 1并且-是對我沒用他們也跟著在整個應用程式相同的結構。因此,使用僅選擇這些專案應位于的索引的方法應該很容易。
這個字串中最重要的索引是 where 所在over的位置。一旦我找到了,我就可以搜索它周圍的索引以找到我需要的其余資訊的位置。
let findOver = arr.indexOf('over')
let winnerName = arr[over - 3].concat(' ', arr[over - 2])
let winnerSchool = summaryBreakUp[over - 1]
這適用于上面的字串,至少適用于左側。它獲取獲勝者的名字和姓氏并將他們連接起來。
我的問題是當字串看起來不像左側時,我如何考慮像上面那樣的邊緣情況。
我可以搜索所有這些( && )并捕獲其中的所有資料以獲取,School Names但隨后我需要篩選一種方法來確定哪個是學校,哪個是昵稱。
任何方向將不勝感激。我還將發布更多示例,以防其他人想嘗試一下。
這是對未指定對手的勝利。
Michael Macontish (Fairview) over Unknown (For.)
沒有給定的回合
John Heflin (Arlington) over Random Kid (Mistview) (Fall 1:59)
沒有給
定的
秋天
Round 2 - Logan Paul George (High School) over Dontae Inverse (Jackson County) (Dec 3-0)
uj5u.com熱心網友回復:
使用正則運算式和捕獲組來獲取您感興趣的位,您可能需要做一些小的整理作業。
您可以使用許多模式(我確定這不是最好的,但這是一個開始):
([\w\s\(\)] )\s\(([\s\w\.] )\)\sover\s([\w\s\(\)] )\s\(([\s\w\.] )\)
這與名稱匹配
- 任何字母數字、下劃線、空格或括號
- 一次或多次發生
后跟一個開括號,后跟學校作為
- 任何空格、字母數字、下劃線或句點
- 一次或多次發生
后跟一個閉括號,后跟空格,然后是單詞“over”,再次是空格,然后重復姓名和學校模式。其他一切都被忽略。
用法:當您在 javascript 中使用正則運算式時,捕獲組最終作為結果陣列中的元素。整個匹配是第一個元素,每個附加元素按順序表示捕獲組。此運算式中有 4 個捕獲組,因此您最終會得到代表 name1、school1、name2 和 school2 的元素 1-5。
const re = /([\w\s\(\)] )\s\(([\s\w\.] )\)\sover\s([\w\s\(\)] )\s\(([\s\w\.] )\)/
const input = [
'Round 1 - Foo Bar (SchoolName) over John (JC) Cena (Fake School Name) (Fall 1:19)',
'Michael Macontish (Fairview) over Unknown (For.)',
'John Heflin (Arlington) over Random Kid (Mistview) (Fall 1:59)',
'Round 2 - Logan Paul George (High School) over Dontae Inverse (Jackson County) (Dec 3-0)'
]
input.forEach( i => {
console.log(i.match(re))
})
uj5u.com熱心網友回復:
作為替代模式,您可以使用非貪婪點.*?來匹配任何字符或使用否定字符類[^來擴大匹配范圍以排除允許匹配的內容。
以可選地匹配開頭的部分開始模式 - 。
要匹配最后括號之間的正確部分,您可以斷言括號之間的部分沒有 - 或 : 在使用負前瞻的數字之間。
(?:.*?\s -\s )?([^()] )\s \(([^()] )\)\s over\s (.*)\s \((?![^()]*\d[-:]\d[^()]*\))([^()]*)\)
模式匹配:
(?:.*?\s -\s )?可選地匹配以結尾的部分<code> - </code>([^()] )捕獲組 1以匹配除(和之外的任何字符)\s匹配 1 個空白字符\(([^()] )\)匹配(然后捕獲任何字符,除了(和)在第2組和匹配)Match1 個或多個空白字符之間的\s over\s over`(.*)捕獲第 3 組中的任何字符\s匹配 1 個空白字符\(比賽((?![^()]*\d[-:]\d[^()]*\))負前瞻,斷言括號之間沒有:或-數字之間([^()]*)如果斷言是真的,捕捉任何字符,除了(和)在第4組\)比賽)
查看正則運算式演示
const regex = /(?:.*?\s -\s )?([^()] )\s \(([^()] )\)\s over\s (.*)\s \((?![^()]*\d[-:]\d[^()]*\))([^()\n]*)\)/;
[
"Round 1 - Foo Bar (SchoolName) over John (JC) Cena (Fake School Name) (Fall 1:19)",
"Michael Macontish (Fairview) over Unknown (For.)",
"John Heflin (Arlington) over Random Kid (Mistview) (Fall 1:59)",
"Round 2 - Logan Paul George (High School) over Dontae Inverse (Jackson County) (Dec 3-0)"
].forEach(s => console.log(s.match(regex)));
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/369188.html
標籤:javascript 反应 细绳 分裂 级联
下一篇:JS中正確的冒泡排序沒有任何作用
