弹幕正则屏蔽的正确使用姿势
写作cl结果是个编译器
编辑于 2019年05月19日 23:11


b站具有弹幕的正则屏蔽 功能,很多人可能不知道正则是什么意思,但是作为程序员,这是必要的修养。如果你不是程序员,也没有关系,本文力图让普通人也可以理解和使用正则屏蔽。不过我主要是写python3的,b站不知道用什么语言处理的,不同语言的正则基本是一样的,但是还是有一些不同的,当然用作弹幕屏蔽不需要知道那么深入。

什么是弹幕屏蔽?

相信大家都用过弹幕屏蔽功能,在电脑手机端都有。普通的弹幕屏蔽规则很简单,比如你屏蔽“前”字,那么所有带“前”字的弹幕都会被屏蔽掉,比如视频开头喜欢刷的“前三”,“前十”,但是同时,你也看不到“前方高能”这样的弹幕了。


正则屏蔽的一个实例

比方说很多人经常刷:

这么可爱的动画刷这个太禽兽了

考虑到还有人刷类似"我家母猪怀孕,谁干的?&#​34;,所以大概会选择屏蔽"干的&#​34;,然而,我又想到有些大快人心的地方看到大家刷"干的漂亮&#​34;还是很开心的,那么有什么办法呢。如果你知道正则表达式的话,你可以输入下面的正则屏蔽词:

下面解释一下这是什么意思呢?

  • 首先//是b站正则屏蔽要求的符号,据我浅薄的知识,javascript的正则表达式是这个符号,可能这也是b站使用正则版本。

  • “干的”这两个字还是必须存在的,接下来的[]符号表示范围,也就是在里面选择其中一个符号,为了阻止某些神棍,还是中英文都加上吧。

  • 不过有的人不加标点或者加"!!!&#​34;这样的呢?[]符号之后的*符号表示匹配0次或多次。

  • 既然可以匹配0次,不还是和"干的&#​34;两个字没有区别吗?别慌,最后$符号表示末尾匹配,也就是上述字符串在末尾出现才匹配成功

  • 现在你将屏蔽掉大部分,而且不会伤害到“干的漂亮”,不过据我观察还是有一些漏网之鱼,这些神棍直接把人屏蔽吧。

怎么样,是不是很神奇。这就是正则表达式的有趣之处。

正则匹配基础

  • 限定符:前面已经出现过,主要有*(0到多个),?(0或1个),+(1到多个),{n}(n个),{n,m}(n到m个),{n,}(n个以上)。限定符都紧跟在要限定的字符后面。比如yo+可以匹配"yooooooo...&#​34;,而you{2,3}只匹配"yoo&#​34;或"yooo&#​34;。

  • 定位符:前面也已经出现过了。

    1. ^匹配开头,放在字符串开头。

    2. $匹配结尾,放在字符串结尾。

    3. \b边界,即和字符和空格边界,单词一般左右两个边界,因此\b的位置决定了匹配那个边界。

    4. \B非边界,位置不重要,因为非边界并不会管你是哪个边界。

  • 范围:这个前面也出现过,就是[]符号。此外,选择符号还可以用[0-9]表示全部数字,[0-9a-zA-Z]表示全部数字以及全部字母。值得一提的是[\u4e00-\u9fa5]可以匹配全部中文字符。此外,^符号在这里还有另外一个作用,就是否定,例如[^0-9]匹配所有非数字字符。

  • 选择|表示选择,例如男主|女主,就可以将这两个都匹配到。[]在范围内选择是单字符,而选择给出了更大的自由。

  • 括号:我们已经见识到了[](范围)和{}(限定)的作用,还有就是()符号了,括号提供了一个独立的空间,例如(男|女)主和前面是一样的,此处的选择操作就只发生在括号内部。对程序员还有更多用处,这里就不提及了。

  • 转义:有一点程序基础的应该会想到,前面定义了这么多特殊字符,应该要用到转义吧。一些非打印字符如\t\r\n\f等,依然保持原样,前面提到的特殊作用的字符,如果要匹配,需要在前面加上\转义,比如\$匹配字符$

  • 特殊字符:除了上面的,还有一些特殊字符以及特殊转义。

    1. .,匹配除了换行符\n之外任意单字符。

    2. \d,数字,等价于[0-9]\D,非数字,等价于[^0-9]

    3. \w,任意数字,字母以及下划线。\W\w之外的字符。

    4. \s,任意空白字符,等价于[ \f\n\r\t\v]\S,任意非空字符。因此,通常可以使用[\s\S]来匹配任意字符。

其他例子

  1. 前面提到的刷“前几”的,可以这样屏蔽:/[前第][一-十]/。这要感谢在汉字编码时一到十的是连续的,因此这个可以匹配“第三”之类的

  2. 在《狼与香辛料》开头,有很多人刷“从……来的“,屏蔽单字杀伤面积过大,用正则可以写:/从.+来/。还记得.匹配除了换行符\n之外任意单字符吗,还有+的用法。这个例子说明了正则屏蔽可以屏蔽某些句式,在某些讨厌的大量刷屏时还是很有用的。

  3. 关于刷日期,如果时单纯数字日期,/\d+.\d+.\d+/就可以屏蔽诸如2018.6.18。不过有时候他们刷2月30日这样就很讨厌。我想到的办法也只有/[0145789]/,当然我还是想看23333和666666的。

  4. 忘记在哪部番,有大量”吓得我……“,然而他们毕竟还是小学生,以至于出现不少”下的我……“。于是我只好正则屏蔽:/^[下吓][的地得到]我/,注意我用了一个从头开始匹配。所以说,以前也有不少,屏蔽“菜月昴”却因为别人写错字看到不想看到的词,也可以采用类似的写法。

大量刷别的番相关内容是不好的