设为首页收藏本站喵玉殿官方微博

 找回密码
 少女注册中
搜索
查看: 5842|回复: 3

[音频视频] 【渣包向】正则表达式 修(2)

[复制链接]
发表于 2011-6-19 13:45:45 | 显示全部楼层 |阅读模式
本帖最后由 pa001024 于 2011-8-25 16:07 编辑

看到B站弹幕能用正则式所以想来介绍一下这玩意的用法,仅仅渣包向,分为1L理论篇和2L实例篇,那啥我会尽量不枯燥的。。
█理论篇█
难度:浮云
正则表达式…….呢就是
用一段文本来表示一个格式,用它很方便地从大量文本中提取出有用的东西,
最简单的正则表达式
也就是神马符号都没有只有一段文本比如说“喂喂
用它就可以达到查找的效果,所有含有“喂喂”的都会被匹配,
可不是只有这样哦,用它可以干一些很厉害的事情呢!
一、概念
1.子表达式
1.一个字符(包括用\做前缀的所有蛋蛋-_,)  比如:\d个笨蛋!
2.用括号“()”括起来的任意表达式  比如:(\d+|[一二三四五六七八九]+)
3.参数型,即应用“{}”号的一段或“[]”号括起来的一段  比如:[一二三四五六七八九]{3}
4.选择型,即使用选择型的一段
(|是例外)
4.可以换行(换行的部分被视为\n)
要注意的是,字符一定是子表达式,子表达式不一定是字符
2.表达式
即一个或多个子表达式(包含连续的字符和字符与子表达式的组合)  比如:(\d+|[一二三四五六七八九十]+)个笨蛋
像上面的连续的情况,要加括号才能变子表达式
二、基本语法
1.选择型(被视为子表达式处理)
“^”“$”——“这是头”“这是尾”
^能匹配输入的开头,屏蔽某些XX很有用
$能匹配输入的结尾,屏蔽某些XX很有用
“*”“?”“+”——“这是有几个”
这三项必须跟在一个子表达式后
*能匹配前一个子表达式零次或几次,“有些人存在不存在都无所谓”
?能匹配前一个子表达式零次或一次,“来就来,别多来”
+能匹配前一个子表达式一次或几次,“来来来,多多益善”
“|”——“或者”
(吐槽:我一开始不会打这个字符,还以为是特殊字符来着,拼命找啊...其实它就在回车键得上面,我当时那叫一个卧槽啊....蛋碎了)
用来间隔子表达式,匹配其中任意一个,不限次数,“你,你,或者你”
2.参数型(被视为子表达式处理)
“{}”——“*N”
{【最少出现次数】【,【最多出现次数】】}
1、第一个【】不填表示0
2、第二个【】中里面的不填表示无限大,
3、外面的【】不填(也就是{2})表示出现一定次数(也就是最少出现次数和最多出现次数相等)
需要跟在子表达式的后面
PS:
1、第一条说明的,就是{,100}等效于{0,100},第一个填不填都一样
2、形如{1,}
3、形如{1}
特例:
1、“*”“?”“+”所代表的含义可以分别用{0,}   {,1}   {1,}代替,逆转同理
“[]”
[字符]能匹配其中的任意一个字符,注意这里不能用子表达式了,这些字符也不用加\号来匹配了→.^&*?+()[]{},当然这个字符要是写在第一个的话是要加\号的→^,这个字符无论如何都要加\→-(连字符)
PS:
出于这点所以不能用[(12)(23)]来代替(12|23)
比如要匹配^1-.2^3*(4){}的话[\^\-1-4.*(){}]
而如果不放在[]里,要这么写才行\^1-\.2\^3\*\(4\)\{\}
(正常情况-号可不用加\)
[A-B]能匹配字符范围,能连写像这样→[A-Za-z],根据字符的编码来进行,因为汉字编码中一二三等得编码不是连续的,所以[一-九]是不行的
3.通配符(被视为一个字符处理)
.     匹配除了换行符的任何字符
\w    匹配单词[A-Za-z0-9_](注意有下划线哦),大写表示相反的情况
\b
匹配单词的边界,即当(双字节字符|符号|单词|空白符)四种情况发生改变的时候,大写表示相反的情况
\d    匹配一个数字[0-9],大写表示相反的情况
\f    匹配分页符
\n    匹配换行符(也就是WORD里那个向下的箭头)
\r    匹配回车符(WORD里那个折一下的箭头)
\t    匹配制表符
\v    匹配垂直制表符
\s    匹配空白符,即连续匹配以上五项,大写表示相反的情况
4.编码型(被视为一个字符处理)
\八进制(3位字符\000)
\x十六进制(2字符\xff)
\u十六进制宽字符型(4字符\xffff)
注:
中文[\u4e00-\u9fa5]
英文[\x00-\xff]
宽字符[^\x00-\xff]
5.特别的
\num    匹配第num个()的匹配结果,注意是结果不是表达式(被视为一个字符处理)
可以隔一段距离来匹配,比如
(蛋蛋哟|喵了个咪)这(泥马|卧槽)真蛋疼\2\1

  1. 喵了个咪这卧槽真蛋疼卧槽蛋蛋哟
  2. 蛋蛋哟这卧槽真蛋疼卧槽蛋蛋哟
  3. 蛋蛋哟这泥马真蛋疼卧槽蛋蛋哟
  4. 喵了个咪这泥马真蛋疼泥马喵了个咪
复制代码


可以匹配出

  1. 蛋蛋哟这卧槽真蛋疼卧槽蛋蛋哟
  2. 喵了个咪这泥马真蛋疼泥马喵了个咪
复制代码


而如果用(蛋蛋哟|喵了个咪)这(泥马|卧槽)真蛋疼(蛋蛋哟|喵了个咪)(泥马|卧槽)则全部都匹配
(吐槽:.........这例子真..毛线啊!!!)
█实例篇█
题:bili屏蔽过长过短弹幕
难度-超级浮云
.{,4}|.{20,}
(自行改数字)
题:bili屏蔽剧透弹幕
难度-真·浮云
^剧透.+|.*最后.+了
题:bili屏蔽纯符号纯遮挡等无意义弹幕
难度-浮云
^[^\u4e00-\u9fa5]*$|无压力$
题:bili观众专用屏蔽(用此观看神弹幕就会...)
即以上三个合体(做个示范,试着自行合体):
.{,4}|.{20,}|^剧透.+|.*最后.+了|^[^\u4e00-\u9fa5]*$|无压力$
题:biliUP主专用屏蔽
难度-蛋
^[^\u4e00-\u9fa5]*(.*顺便)?[^求]
说明:只显示含有“求”的弹幕
小朋友们大家嚎,下面有点无聊了,可选内容(吐槽:好像一直都很无聊)
题:判断路径是否合法
难度-弱到

  1. c:
  2. c:\windows\
  3. C:\Program Files\WinRAR\WinRAR.exe
  4. dan\ws.exe
  5. http://www.baidu.com
  6. dn.qq.com/caonimadeshengdalaoziyouC9.php
  7. mms://河蟹你全家.天朝
  8. 12@12.cn
复制代码


网页
^([A-Za-z]+://)?(\S+/?)+$
完整路径
^([AC-Zac-z]:|[^\\/:*?"><|\n\r\t\v]+)(\\[^\\/:*?"><|\n\r\t\v]+)*\\?[^\\/:*?"><|\n\r\t\v]+$
相对路径(带扩展名)
^([^\\/:*?"><|\n\r\t\v]+\\)*[^\\/:*?"><|\n\r\t\v]+\.[^\\/:*?"><|\n\r\t\v]+$
Email(按需求改数字)
^\w[\w-+.]{1,}@\w[\w-.]{1,}(\.\w[\w-.]{1,})*$
注:四个相互不会串,根据需求可以用|连起来
题:从一段文本中取IP(判断IP是否合法)
难度-EASY
首先全角转半角(可选)
删空格(可选)
然后出现以下实例

  1. []0256.226.245.267
  2. 看挨批<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />9.9.9.9!
  3. 256.123.23.2[GING]110.119.120.114:10086
  4. 001.002.003.004大丈夫萌大奶
  5. 256..255.788.哇998.0.1.0
  6. 1994.10.24.00.13八百标兵奔北坡
  7. ...0012.0123.88.998.yoo
  8. IPv4地址我们知道是由0.0.0.0到255.255.255.255的
复制代码


首先想到\d+\.\d+\.\d+\.\d+或者\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
不得,取出来999.999.999.999这样的,吃得鸟吗?(当然如果是交给程序再让程序筛选那么\d+\.\d+\.\d+\.\d+已经够用了)
所以我们需要在(首位为2)时确保((次位小于5)或(次位等于5且末位小于6))
基本完美模式如下
\b(([01]?\d?\d)|(2[0-4]\d)|(25[0-5]))\.(([01]?\d?\d)|(2[0-4]\d)|(25[0-5]))\.(([01]?\d?\d)|(2[0-4]\d)|(25[0-5]))\.(([01]?\d?\d)|(2[0-4]\d)|(25[0-5]))\b
匹配的结果:

  1. 9.9.9.9
  2. 110.119.120.114
  3. 001.002.003.004
  4. 10.24.00.13
  5. 0.0.0.0
  6. 255.255.255.255
复制代码


关于那些001.002.003.004前面的0,不匹配0的情况如下(喂喂喂,越来越长了喂)
\b((1\d\d)|(2[0-4]\d)|(25[0-5])|(\d)|([1-9]\d))\.((1\d\d)|(2[0-4]\d)|(25[0-5])|(\d)|([1-9]\d))\.((1\d\d)|(2[0-4]\d)|(25[0-5])|(\d)|([1-9]\d))\.((1\d\d)|(2[0-4]\d)|(25[0-5])|(\d)|([1-9]\d))\b
匹配的结果:

  1. 9.9.9.9
  2. 110.119.120.114
  3. 0.0.0.0
  4. 255.255.255.255
复制代码


把两个\b去掉问题也不大,就是会从数字中间截断来取IP了,把两个\b换成^$啥的。。。
扩展题:从文本中取数字(三位以内)
难度-NORMAL
一共这么些情况

  1. ①几
  2. ②十
  3. ③十几
  4. ④几十
  5. ⑤几十几
  6. ⑥几百
  7. ⑦几百零几
  8. ⑧几百几十
  9. ⑨几百几十几
  10. ⑩几千
  11. 1几千零几
  12. 2几千零几十
  13. 3几千零几十几
  14. 4几千几百
  15. 5几千几百零几
  16. 6几千几百几十
  17. 7几千几百几十几
复制代码


。。。。。。。。渣包求解答(数字用几来表示就行)
(吐槽:wohaoruo)

评分

参与人数 1积分 +4 萌度 +32 收起 理由
lzz3012 + 4 + 32 打字费(雾

查看全部评分

发表于 2011-6-19 15:44:03 | 显示全部楼层
……看了⑨遍仍然看不懂……
回复

使用道具 举报

 楼主| 发表于 2011-6-19 16:44:57 | 显示全部楼层
回复 ooxoo 的帖子

不好意思有点写得太急了
我改改
回复

使用道具 举报

发表于 2011-6-29 17:44:12 | 显示全部楼层
额……
{}那段可以修改下么?
看了半天没看懂……
回复

使用道具 举报

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

本版积分规则

合作与事务联系|无图版|手机版|小黑屋|喵玉殿

GMT+8, 2025-10-31 15:07

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表