最近在 B 站看的技术视频比较多,也会偶尔看一些娱乐方面的内容。
技术视频本身关注度不高,于是我关掉了弹幕智能屏蔽,顺便吐槽一下这个屏蔽机制,其实用户的等级对弹幕是否被屏蔽还是有很大影响的。
但当我在关掉智能屏蔽的情况下打开一个娱乐视频时:
[图片上传失败...(image-f85b6a-1650531264911)]
这里为了演示我把弹幕显示范围改成了全屏,平时我只会开到四分之一屏幕,但就算这样弹幕也会被一堆重复内容堆满。
说到这里就要有人问了,弹幕屏蔽选项里有重复这一项啊,打开不就可以了?
然而重复弹幕屏蔽选项对不同长度的相同内容无效。
有一些油猴脚本可以对弹幕进行更精准的过滤操作,但它们只能在电脑网页端使用,我需要的是全平台的过滤。
所以我打算使用 B 站的自定义屏蔽规则功能解决这个问题。
在翻找设置项的时候,我无意间发现 B 站支持使用正则进行弹幕过滤。经过一番操作后,我看到的弹幕信息质量得到了很大的提升。
什么是正则表达式?
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
简单来说,正则表达式就是用来检索特定文本的规则。
举个例子,很多网站在新用户注册的时候,使用正则表达式判断用户设置的密码是否足够安全。
正则表达式本身也是文本,其中包含一些有特定含义的符号。
例如,这是一个正则表达式:
.*
这也是一个正则表达式:
(\b25[0-5]|\b2[0-4][0-9]|\b[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}
常见匹配符号
在正则表达式中,有些符号具有特定的语义。
我们先从简单的开始。
.
表示单个字符。
我们可以使用这个网站对正则表达式进行验证。打开这个网站后,输入一段正则表达式,下方匹配到的文本就会被高亮标记出来。
如果将 .
作为一条正则表达式,匹配结果如下:
[图片上传失败...(image-41313e-1650531264911)]
我们可以发现, 每一个字符都被单独匹配出来了。
?
代表其之前的规则可以重复出现一次以上,例如 .?
代表匹配出现一次以上的任意字符。
*
代表其之前的规则可以重复出现零次以上,例如 .*
代表匹配出现零次以上的任意字符。
{}
中的数字或者范围代表其之前的规则可以重复出现指定次数,以 .{3}
为例:
[图片上传失败...(image-49f735-1650531264912)]
每行文本以三个为一组被匹配出来。
如果我们将这条正则表达式更改为 .{8,10}
呢?
[图片上传失败...(image-a8383d-1650531264912)]
第二条文本由于长度为 4,不在 7-9 这一范围内,所以没有被匹配到。
第三条文本由于长度超过 10,因此只有前 10 个字符被匹配到。
{n,}
表示 n 次及以上。
这些规定了匹配规则的字符,我们叫做限定符。
[]
中的字符或者范围代表只有其中的字符会被匹配到,例如 [abc]
代表只有字母 a、b 或 c 会被匹配到,而不是匹配 abc 这段字符。
[a-z]
代表所有小写字母都会被匹配到。
在 []
的开头加入 ^
代表逻辑中的“非”关系,例如 [^a-z]
匹配除小写字母以外的字符。
\w
可以匹配大小写字母、数字及下划线,等价于 [A-Za-z0-9_]
。
这些对要匹配的内容做出规定的字符,叫做普通字符。
在正则表达式的开头加入 ^
,代表只匹配开头部分的字符串;加入 $
,代表只匹配结尾部分的字符串。
例如 ^I.*\.$
这条正则表达式:
[图片上传失败...(image-2062b-1650531264912)]
这条正则表达式匹配开头为 I,且以英文句点结尾的句子,因此只有“I am a writer.”被匹配到了。
了解了这些知识,我们就可以使用正则表达式对弹幕进行过滤了。
尝试过滤弹幕
首先,我们想要过滤掉任何只有“爱”字,且其出现次数超过五次的弹幕。
我们可以写出如下正则表达式:
^爱{5,}$
其匹配规则如下:
- 后面的内容必须出现在开头
- 匹配连续出现五次以上”爱“字的内容
- 之后必须是结尾
将正则复制到测试工具里,写几行文本测试一下,效果符合预期:
[图片上传失败...(image-381841-1650531264912)]
之后,我们打开弹幕设置,选择”添加屏蔽词“,然后在”正则“选项卡中将我们的正则表达式粘贴进去:
[图片上传失败...(image-ef156-1650531264912)]
注意,添加正则时,需要将其用 /
包裹,否则依然会弹出添加成功的提示,但其不会在列表中出现,也不会生效,希望 B 站可以优化一下这个功能的体验。
再次打开开头的那个视频,可以发现右侧滚动弹幕上大片的”爱“字明显减少:
[图片上传失败...(image-837ecb-1650531264912)]
点击跳转到该视频的指定时点
(说右上角有一条没被屏蔽的小伙伴,认真看看,他发的是”受“)
效果不错,不如...再来个例子试试?
[图片上传失败...(image-1cf01d-1650531264912)]
注意上方弹幕的左侧,有一条弹幕是”两分钟“,中间还有一条”5分钟“。
一般来说,这些时间代表这个用户看到视频与该视频发布的时间差,用来表示对这位创作者的关注,但根据相关规则,这其实会影响大家的观看体验。
所以我们打算写一条正则表达式屏蔽这种弹幕。
我们的正则表达式是这样的:
^(\d|零|一|两|二|三|四|五|六|七|八|九|十)+(秒|分钟|小时)
匹配规则如下:
- 后面的内容必须位于开头
- 匹配所有阿拉伯数字和汉字数字,它们可以出现一次以上
- 后面紧跟着”秒“、”分钟“或者”小时“
测试一下:
[图片上传失败...(image-7634f9-1650531264912)]
(这里漏掉了”两“,后面补上了)
将这条正则添加到屏蔽列表,再次打开视频:
[图片上传失败...(image-b3e64b-1650531264912)]
点击跳转到该视频的指定时点
满足屏蔽规则的弹幕消失了。
关于弹幕礼仪
作为一名技术从业者,我看的娱乐视频不算多,但我也许能提出一些建议:
- 发弹幕的时候,先考虑一下这条弹幕对其他人有没有帮助
- 弹幕字数尽量在 20 字以内,不然在默认设置下弹幕速度很快,无法阅读
- 如果视频底部有字幕(指视频上的字幕,而不是作者提交的内嵌字幕),尽量不要发底部弹幕
- 红色弹幕确实显眼,但表示赞同等不需要改颜色,这不会让你获得更多的赞
- 对于没有字幕的歌曲,如果想要帮忙补上歌词,尽量发底部弹幕,保持颜色一致,并且避开已经有人补充的段落
- 对于歌曲填词作品,如果想要发另一份填词,尽量在顶部发
也希望 B 站能把这些日常行为和社区信用体系关联起来,弹幕可以像视频一样选择点踩,并且根据弹幕被投票的情况对其内容进行复审。
后记
这篇文章只对正则表达式做了初步讲解,如果大家感兴趣,可以自学以下内容:
- 匹配组(可以用来实现文本替换)
- 贪婪匹配和非贪婪匹配
- 不同编程语言种对正则表达式匹配的实现
正则表达式是一个强大的工具,也许在大家眼中,学习它的价值仅限于在 Word 里进行文本替换,但在专业领域,正则表达式的出场频率很高。
这些技能,可能会在之后的某个时刻为你节省大量的时间和精力,何不简单学学呢?