当我学习puppeteer时,我正在抓取一个网页作为一个有趣的小项目,在这段时间里,我遇到了一个小问题,当涉及到清理字符串以获得有用的数据时。我想出了一些简单的方法来提取我想要的数据,但是我遇到了一些我不知道最好的处理方法的情况。
拿着这根绳子
Round 1 - Foo Bar (SchoolName) over John (JC) Cena (Fake School Name) (Fall 1:19)
我想要的数据。
Round 1和-对我来说毫无用处,它们在整个应用程序中都遵循相同的结构。因此,使用仅仅选择索引的方法应该是非常容易的。
这个字符串中最重要的索引是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)
不给Fall
Round 2 - Logan Paul George (High School) over Dontae Inverse (Jackson County) (Dec 3-0)
发布于 2021-11-29 09:27:00
使用regex和capture组获取您感兴趣的部分,您可能需要做一些小的整理工作。
您可以使用许多模式(我肯定这是最好的nt,但这是一个开始):
([\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))
})
发布于 2021-11-29 11:04:34
作为另一种模式,您可以使用非贪婪的点.*?来匹配任何字符或否定字符类[^以排除允许匹配的内容,从而扩大匹配范围。
可以选择地在开始时与-匹配该部分,从而启动该模式。
若要在末尾的圆括号之间匹配右部分,可以断言括号之间的部分没有-或:之间的数字之间使用负前瞻。
(?:.*?\s+-\s+)?([^()]+)\s+\(([^()]+)\)\s+over\s+(.*)\s+\((?![^()]*\d[-:]\d[^()]*\))([^()]*)\)模式匹配:
(?:.*?\s+-\s+)?可选择匹配以<code> - </code>结尾的部件([^()]+)捕获组1以匹配除(和)以外的任何字符\s+匹配1+空格字符\(([^()]+)\)匹配(然后捕获组2和Match )中除(和)之外的任何字符。Match在一个或多个空格字符之间超过`(.*)捕获组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://stackoverflow.com/questions/70152145
复制相似问题