本帖最后由 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 在
- 喵了个咪这卧槽真蛋疼卧槽蛋蛋哟
- 蛋蛋哟这卧槽真蛋疼卧槽蛋蛋哟
- 蛋蛋哟这泥马真蛋疼卧槽蛋蛋哟
- 喵了个咪这泥马真蛋疼泥马喵了个咪
复制代码
中 可以匹配出
- 蛋蛋哟这卧槽真蛋疼卧槽蛋蛋哟
- 喵了个咪这泥马真蛋疼泥马喵了个咪
复制代码
而如果用(蛋蛋哟|喵了个咪)这(泥马|卧槽)真蛋疼(蛋蛋哟|喵了个咪)(泥马|卧槽)则全部都匹配 (吐槽:.........这例子真..毛线啊!!!) █实例篇█ 题:bili屏蔽过长过短弹幕 难度-超级浮云 .{,4}|.{20,} (自行改数字) 题:bili屏蔽剧透弹幕 难度-真·浮云 ^剧透.+|.*最后.+了 题:bili屏蔽纯符号纯遮挡等无意义弹幕 难度-浮云 ^[^\u4e00-\u9fa5]*$|无压力$ 题:bili观众专用屏蔽(用此观看神弹幕就会...) 即以上三个合体(做个示范,试着自行合体): .{,4}|.{20,}|^剧透.+|.*最后.+了|^[^\u4e00-\u9fa5]*$|无压力$ 题:biliUP主专用屏蔽 难度-蛋 ^[^\u4e00-\u9fa5]*(.*顺便)?[^求] 说明:只显示含有“求”的弹幕 小朋友们大家嚎,下面有点无聊了,可选内容(吐槽:好像一直都很无聊) 题:判断路径是否合法 难度-弱到
- c:
- c:\windows\
- C:\Program Files\WinRAR\WinRAR.exe
- dan\ws.exe
- http://www.baidu.com
- dn.qq.com/caonimadeshengdalaoziyouC9.php
- mms://河蟹你全家.天朝
- 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 首先全角转半角(可选) 删空格(可选) 然后出现以下实例
- []0256.226.245.267
- 看挨批<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />9.9.9.9!
- 256.123.23.2[GING]110.119.120.114:10086
- 001.002.003.004大丈夫萌大奶
- 256..255.788.哇998.0.1.0
- 1994.10.24.00.13八百标兵奔北坡
- ...0012.0123.88.998.yoo
- 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 匹配的结果:
- 9.9.9.9
- 110.119.120.114
- 001.002.003.004
- 10.24.00.13
- 0.0.0.0
- 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 匹配的结果:
- 9.9.9.9
- 110.119.120.114
- 0.0.0.0
- 255.255.255.255
复制代码
把两个\b去掉问题也不大,就是会从数字中间截断来取IP了,把两个\b换成^$啥的。。。 扩展题:从文本中取数字(三位以内) 难度-NORMAL 一共这么些情况
- ①几
- ②十
- ③十几
- ④几十
- ⑤几十几
- ⑥几百
- ⑦几百零几
- ⑧几百几十
- ⑨几百几十几
- ⑩几千
- 1几千零几
- 2几千零几十
- 3几千零几十几
- 4几千几百
- 5几千几百零几
- 6几千几百几十
- 7几千几百几十几
复制代码
。。。。。。。。渣包求解答(数字用几来表示就行) (吐槽:wohaoruo) |