通过regex从返回数据HTML中删除所有重复的行



我在应用程序脚本中使用正则表达式从网站抓取数据:

我尝试这个代码:

const name = /(?<=<span class="(.*?)">)(.*?)(?=</span>)/gi; // work Great
for(var i = 0; i < 9; i++){
var names = data[i].match(name)[0];
Logger.log(names)
}

这段代码运行良好,但给了我重复的行:

1:56:22 PM  Notice  Execution started
1:56:35 PM  Info    john
1:56:35 PM  Info    ara
1:56:35 PM  Info    john
1:56:35 PM  Info    anita
1:56:35 PM  Info    ara
1:56:35 PM  Info    fabian
1:56:35 PM  Info    ara
1:56:35 PM  Info    john
1:56:35 PM  Info    fabian
1:56:37 PM  Notice  Execution completed

我想删除所有重复的名称,并看到这样的结果:

1:56:22 PM  Notice  Execution started
1:56:35 PM  Info    john
1:56:35 PM  Info    ara
1:56:35 PM  Info    anita
1:56:35 PM  Info    fabian
1:56:37 PM  Notice  Execution completed

设置

您可以使用集合(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set)为了做到这一点。

names = Array.from(new Set(names));

我们没有你的最终目标,在这里你只需控制台。记录你的数据,但你可能不需要将你的Set back转换为Array:(

排序

另一种解决方案是对数组进行排序,然后对其进行迭代,以便更容易地删除重复项。

array.sort();
array.filter((el, index) => index < array.length && el !== array[index + 1]);

在我的浏览器上测试::

let a = [1,1,2,3,4,4,5,6,7,7];
a.filter((el, index) => index < a.length && el !== a[index + 1]);

数组(7([1,2,3,4,5,6,7];

这个解决方案显然不保留任何订单,而第一个解决方案似乎保留了初始订单,至少在我的firefox的js 上是这样

描述

首先,我会收集一个数组中的所有名称。然后使用[…new Set((]创建一个唯一名称数组。

脚本

function spanTest() {
try {
const name = /(?<=<span class="(.*?)">)(.*?)(?=</span>)/gi; // work Great
let data = ['<=<span class="test">john</span>',
'<=<span class="test">ara</span>',
'<=<span class="test">john</span>',
'<=<span class="test">anita</span>',
'<=<span class="test">ara</span>',
'<=<span class="test">fabian</span>',
'<=<span class="test">ara</span>',
'<=<span class="test">john</span>',
'<=<span class="test">fabian</span>'];
let names = [...new Set(data.map( span => span.match(name)[0]) )];
console.log(names);

}
catch(err) {
console.log(err);
}
}
7:39:23 AM  Notice  Execution started
7:39:23 AM  Info    [ 'john', 'ara', 'anita', 'fabian' ]
7:39:23 AM  Notice  Execution completed

参考

  • Array.map((
  • […new Set((]