金刚 - 舰队collection百鬼夜行 - Ssuika1周年纪念勋章 - 论坛1岁纪念勋章时崎狂三 - 约会大作战香草 - Sayori博丽 灵梦 - Reimu丝芭露 - 放学后的昴星团

[技术讨论] [原创][Geek]初识Regex屏蔽弹幕

1#
发表于 2014-5-7 01:37:19 | 查看: 4829| 回复: 8
本帖最后由 Lwhite 于 2014-5-8 11:57 编辑

正则表达式(Regular Expression)我感觉越来越重要,不仅是linux用户要在一些工具上使用它,对于一个ACG爱好者,Regex也开始发挥它前所未有的作用,屏蔽弹幕。甚至是节省大量编辑特定文本的时间,解放劳动力,让我们把时间拿去做更加有意义的事情。请在学习时务必在AB站播放器勾上启用屏蔽优化屏蔽(正则模式)
元字符
元字符(Metacharacters)的概念很简单,就是描述字符的字符。它本身有别的意思,例如:在WIN的搜索里面输入*.doc这几个字它会把所有以.doc为末尾的文件给找出来,而不是只找*.doc。这个时候*号的意思就是0或无数个任意字符。
*号
Well,首先是*符号,在正则表达式里表示重复它前面的那个字符0次到多次
假如输入hel*o
  1. heo
  2. hello
  3. helo
  4. hellllllllllllo
复制代码
都会中招
这就很好办了,例如在敖厂长被黑暗之魂虐 的视频里面的一大堆2333。我们可以直接输入23,但是误杀率极高。
降低误杀率,只要句子里面有个2后面跟6个3或以上的就会被屏蔽。
  1. 23333333*
复制代码
我这个人比较挑剔,我只想要屏蔽纯2333的弹幕,如果说句有内容的话后面跟233333呢,前面那句话其实也中招了,怎么办,我不想误杀,我要BAN掉以2开头,后面跟一堆3的弹幕。这时需要用到^符号。
^符号
它用来匹配行首,在^符号后面的字符就是行首。例如^Today,那么Today is a bad day就会被匹配。
  1. ^23333333*
复制代码
这下那些纯233333就会死光了,大快人心。
然后我觉得这样还不够,要是我是一个有意义的句子后面跟23333333,这句话也碍事怎么着?我不想要行尾有6个3以上的句子。
$符号
它和^符号相反,它匹配行尾,使用方法也相反,行尾的字符需要放在它前面。例如西瓜$,匹配我要打十个西瓜
  1. 333333*3$
复制代码
这下超过6个3结尾的弹幕就会BAN。
  1. wwwwww*w$
复制代码
同理,以超多w结尾的也能这么玩
  1. ^$ 能匹配空行,因为^后面和$前面完全没有字符,这对于在写论文或报告里那些手贱多按好几次回车求爽的人有着巨大意义
复制代码
.符号
用于匹配一个任意字符(除了换行符)。用法很简单,我找一本叫X然草的书,我就忘了是什么然草,就是不记得第一个字,于是我就搜.然草。最后找到了徒然草这本书。同时我也想起了,我可以利用这个方法来BAN很多弹幕,最简单的例子就是这个XXX我爱你
  1. ...我爱你
复制代码
这下那些XXX我爱你就会死光了,如果你觉得意犹未尽,它也许会输入两个字的或者4个字甚至是5个字的名字。
  1. .*我爱你$
复制代码
这是绝招,任何以我爱你作为行尾的都中招
  1. .*代表任意字符出现0次或者多次
复制代码
这么一想,我发现前面那两个符号根本就不用加上去
  1. 我爱你$
复制代码
这么写就完事了。一样能匹配所有我爱你为行尾的弹幕
[]符号
[]符号能表示一个范围的一个字符,它支持穷举法列出所有被[]符号括住的内容,例如我记得我的一个压缩包的密码是5147639X,我就忘了那个那个X是个什么数字,于是使用5147639[1234567890]去生成一个列表,然后匹配5147639后面加上一个[]符号里面有数字,例如
  1. 51476391
复制代码
其实有更方便的写法[0-9][a-z][A-Z]这种从左到右从小到大的数字或者英文范围,例如要匹配一个从3-8的数字,可以写[3-8],英文也是。
  1. 我爱[你您]$
复制代码
这下我能把漏网之鱼我爱您为结尾的也一起BAN了,非常方便
  1. [A-Za-z][A-Za-z]* 这个是给不喜欢鸟语的人看的,他匹配所有英文单词,准备英语考试的同学还有 Patriot 们看到弹幕里的英语也许会产生过敏症状呢,这条玩意是个好药方。
复制代码
如果想相反呢,例如我偏偏不要[r-z]这个范围怎么办,难道真要我填除了那个范围以外的所有字吗?有更好的方法,使用[^r-z]就能取相反值,当然,这个可不仅是除了r-z这个范围的字母,是除了这个范围的所有字符(包括空格,数字,字母等)
\符号
如果我要匹配的是^$符号怎么办?它是元字符,现在代表空行,我怎么去让Regex认为它是字符而不是元字符呢?通过\符号能轻松地屏蔽掉它后面的那个元字符的意思。让它变回普通的字符,它又被称为转义符
  1. \^\$
复制代码
现在它就能匹配^$了。
这下如果有人在弹幕里说@#$%^&*也不怕。
  1. \@\#\$\%\^\&\*
复制代码
那么现在发元字符也不怕没法子对付了
\<>符号
这个玩意能对单词实施精确匹配。常用的例子就是he,一般的搜索匹配会匹配上he she they them there anthem之类的单词,但用\<he\>就只能匹配he了,这下对付英语文本的处理就方便起来了。
  1. \&lt;fuck\&gt;
复制代码
对其进行无比精确的制导攻击,真是老外居家旅行,看AB站,必备良药
  1. 同时您会发现其实\&lt;>符号是使用转义符\屏蔽&lt;&gt;这两个符号的产物
复制代码
{}系列符号
它和*符号类似,都是表示它前面的那一个字符的重复,不过这货能指定重复次数进行匹配。
  1. 23{6}
复制代码
只能匹配2后面跟6个3,只能屏蔽2333333
  1. 23{6,}
复制代码
匹配2后面跟6个或以上的3
  1. 23{6,20}
复制代码
匹配2后面跟6-20个的3
这下最初那条2333333*$可以改成23{6,}$了,简洁了很多。
AB站都有说紫妹会被按在键盘上滚,然后输出一堆乱写的英文这种传统
  1. 紫妈.*[0-9a-zA-Z]{10,}
复制代码
看你还怎么滚键盘
<h1>扩展正则表达式</h1>
?符号
匹配它前面的那个字符0次或者1次,实例
FFF团
它们有时候会少打一个F,所以我们使用
  1. FF?团
复制代码
这下FFF团算是消停了一些
+符号
它也和*符号类似,匹配它前面的那个字符多次,而+符号至少匹配1次
  1. FF+
复制代码
这下3个F以上的弹幕都会消失了,团灭FFF团了
  1. [Ff]{3,}
复制代码
真.团灭FFF团
()符号
[]符号一样,而且还需要在中间加这个|符号。
  1. f(u|x)(c|x)k
复制代码
传说中的老外万金丹
|符号
它就是的意思,可以用它把各种正则表达式1行搞定。格式就是表达式|表达式|表达式|表达式|表达式,想要多少条就多少条。
  1. 紫妈.*[0-9a-zA-Z]{10,}|FF+|f(u|x)(c|x)k
复制代码
注意顺序,它是从左到右匹配的,要是左边匹配成功就不会管了
这是把之前几条表达式合并的产物
A站常用Regex
内含一颗危险(?)误杀率的超新星爆炸发生器请酌情减轻当量,以免炸错星系(建议从原站点复制,这里的代码里面的一些符号被自动转换了,所以请自行复制使用)
\b符号
它能匹配单词的开始或结束位置,搜寻英文文章单词的利器
  1. \bhe
复制代码
匹配以he开头的单词,就是说连helicopter helium he之类的单词也能匹配
  1. he\b
复制代码
匹配以he结尾的单词,例如the
  1. \bhe\b
复制代码
精确匹配he
\w符号
匹配一个字母或数字或下划线
  1. \w{30,}
复制代码
它会把30个或以上的字母数字或者下划线组成的弹幕灭掉
\d符号
匹配一个数字
  1. Q群.*\d{8,}
复制代码
误杀率比较高,如果前面加上Q群之类的关键字可以把报Q群号的秒杀
\s符号
匹配一个任意空白符,就是tab和空格
  1. 瞬\s*间\s*爆\s*炸
复制代码
看LOL视频的时候或许会需要的东西
\D符号
匹配非数字的一个字符
  1. 傻\D+
复制代码
傻字后面通常不会有好事,这也许误杀率过高,但有洁癖的人可以用,实际上A站那个超长Regex里面提取出来有谩骂意向的词效果极佳
\W符号
匹配任意不是字母,数字,下划线的字符
\S符号
匹配非空白字符
  1. \S{29,}
复制代码
匹配29个重复的非空白字符
  1. [\S]{29,}
复制代码
匹配29个任意非空白字符组合,也就是限制弹幕长度为29个字
\B符号
匹配非单词开头或者结束的位置
\t符号
匹配Tab键,制表符
\r符号
匹配回车
\n符号
匹配换行,这下竖向弹幕也得中招
  1. \n{2,}
复制代码
暂时到这里
扩展链接:
JavaScript用Regex
30分钟学Regex

神圣的圣杯显现在了Lwhite的眼前,Lwhite小心翼翼地拿起了 1 个 圣杯

不要再问我要ID,我都已经多次告诉过你们怎么找图了,去画师自己的页面去看才叫原汁原味,才叫最大的尊重。
回复

使用道具 举报

20
1周年纪念勋章 - 论坛1岁纪念勋章初音未来 - Vocaloid雪初音 - Vocaloid大妖精 - 大妖精帕秋莉x小恶魔 - 东方系列牌子帕秋莉·诺蕾姬 - 七曜的大魔法使露娜 - 东方Project秦心 - 秦心芙兰朵露 - 芙兰朵露秦 心 - 东方Project不死の火鸟 - Moko⑨ - Cirno普通の魔法使 - Marisama不动の大图书馆 - Patchouli魔法少女Cirno - Cirno七曜の大魔法使 - Patchouli大图书馆の管理员 - Little Devil永恒の丰收 - Aki狂气の红眼 - Reisen友利奈緒 - Charlotte
2#
发表于 2014-5-7 08:05:34
竟然是正则表达
话说银币好亮

点评

噗...噗...無法直視 

发表于 2014-5-7 08:26

glasseye踩到一个坛娘遗失的肥♂皂滑倒了,从口袋里掉出来了 9 枚 星币

欺负妖梦的除了幽幽子大人都是坏人!!!!!
回复

使用道具 举报

3#
发表于 2014-5-10 20:07:14
B事SAGE   
回复

使用道具 举报

4#
发表于 2015-1-25 19:45:30
好晕啊但还是要顶
回复

使用道具 举报

5#
发表于 2015-3-24 18:57:24
感谢LZ分享
回复

使用道具 举报

6#
发表于 2015-5-15 20:39:09
竟然看到了正则表达式的教程了!支持!正则对中文总感觉有些玄,javascript可以很友好的支持中文吗?前面的*.doc这个*是通配符,正则是 .*\.doc$
很远很远之前。。。
回复

使用道具 举报

金刚 - 舰队collection百鬼夜行 - Ssuika1周年纪念勋章 - 论坛1岁纪念勋章时崎狂三 - 约会大作战香草 - Sayori博丽 灵梦 - Reimu丝芭露 - 放学后的昴星团
7#
发表于 2015-5-15 22:28:16
meamin⑨ 发表于 2015-5-15 20:39
竟然看到了正则表达式的教程了!支持!正则对中文总感觉有些玄,javascript可以很友好的支持中文吗?前面的 ...

是的,它们是可以很友好地支持中文。
不要再问我要ID,我都已经多次告诉过你们怎么找图了,去画师自己的页面去看才叫原汁原味,才叫最大的尊重。
回复

使用道具 举报

8#
发表于 2015-5-18 19:47:29
javascript学习中,楼主总结得好
回复

使用道具 举报

9#
发表于 2015-5-24 22:36:34
晕了但是顶

坛娘偷偷的在sfgxsfc的口袋里放入了 5 枚 星币

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则