什么是正则表达式和尝试使用

正则表达式是对文本进行处理,查找符合某些复杂规则的字符串。正则表达式就是用于描述这些规则的工具。也就是说看到一串文字,我们如何从这堆文字中获得某些文字呢? 这就是我们的正则表达式的作用了。用来进行文本匹配的工具。

比如现在有一段文字 就这个网页 https://www.douban.com/online/10000682/discussion/1344081/ 我们要从里面的文字中获取所有的email 邮箱地址。那么怎么做呢?

大家留下email吧。。 2008-08-20 16:44:39 [已注销] ahnqiral@hotmail.com 2008-08-20 18:57:43 雷子妹子 (狮子月) pengxl0821@hotmail.com 2008-08-20 19:21:53 小小土豆 xiexiang9184@yahoo.cn 2008-08-20 19:44:12 ._我是莫非。我回来等你了 elegantplastic@hotmail.com 2008-08-20 20:20:40 左边 (你是我的天使。) amandaandamanda@hotmail.com 2008-08-20 21:04:57 疯儿 (兔年水瓶烈女) qushifeng56789@yahoo.com.cn 2008-08-20 21:50:12 kolin (狠狠的!~~~) ac56yc@163.com 2008-08-20 21:59:58 少年默默没烦恼 blue0406@Tom.com 2008-08-21 02:03:22 阿So回来了! mx700@hotmail.com 2008-08-21 06:54:52 干么泥 (、、、、、、) wlwade@hotmail.com 2008-08-21 11:47:12 Krypton (desk potato) shadow1854@126.com 2008-08-21 15:15:07 年 (浮生有涯。) camel0213@hotmail.com 2008-08-21 15:35:20 Gavin’s (这雨下的。。。) kylema66@hotmail.com 2008-08-21 15:48:43 圆球 宝小多 (我听闻 你仍守着古城) shenqing.yong@163.com 2008-08-21 20:47:12 大仲兔🐰ЯαβЪìТ (在下大仲兔是也。) bluebeck07@hotmail.com 2008-08-22 12:04:14 美珍香发棱 (indeed!) errorguo@gmail.com 2008-08-22 12:50:50 Yaki_木 (, 恋旧癖) alyyyq@gmail.com 2008-08-22 13:54:32 笨尼 bennylcry@126.com 2008-08-22 14:04:02 飒飒 (你好,我是飒飒。) qianyun88888@hotmail.com 2008-08-22 15:19:08 打PP (上海) oyh0932@hotmail.com 2008-08-22 19:10:32 littlecl lynar26@gmail.com 2008-08-22 20:39:34 jean (不怕) jeanjaneliy@163.com 2008-08-22 22:50:05 泛宁° (大夫我觉得我可以再抢救一下) ifannin@hotmail.com 2008-08-23 00:02:23 haoleung (I‘m a weirdo.) haoer930@hotmai.com 2008-08-23 08:25:19 桑田 fayesure2046@126.com 2008-08-23 09:04:11 小小泥菩萨 amengzai@126.com 2008-08-23 16:02:14 [已注销] zhi-love@163.com 2008-08-23 17:37:32 弥生 (让我去那花花世界) xiangrong1215@hotmail.com 2008-08-23 21:41:14 贝 365202373@qq.com 2008-08-24 17:19:13 Carissa (Que sera, quesadilla) jiayuan.yao@gmail.com 2008-08-24 17:47:02 Sue*Forever。 (I’m back.) sueping009@163.com 2008-08-24 23:58:02 Quentin kfzjy@163.com 会吗? 2008-08-25 07:39:58 wwe freewanghui@126.com 2008-08-25 10:05:00 歪头吸管 (人 不能俗,可 我特俗,) bighead-yuan@hotmail.com 2008-08-25 17:13:50 贩卖兔子的萝卜 (为每一个愿望努力奋斗。) carrotlei@hotmail.com 期待会有人给我mail内~~ 2008-08-25 22:13:47 丫牛牛@HZ (幸福,由心不由境。) yaoling0425@yahoo.com.cn 2008-08-26 01:57:33 米-米 (流淌的生命) pollyjingjingde@gmail.com 各种拒绝广告~ 2008-08-26 03:42:38 Dorothy bubble_0123@hotmail.com 期待Ing~ 2008-08-26 09:58:11 格格巫 silence0o@hotmail.com 喜欢收mail~ 2008-08-27 00:12:07 泰小迪 (life goes on) lilithluoan@yahoo.cn 愿意倾听 2008-08-27 02:13:24 [已注销] tingting8628@sina.com 2008-08-27 09:21:37 aliceand alice (你所能感受到的就应该去相信。) alice.c@live.cn 2008-08-27 10:16:48 Mr疯 (用扯淡的态度,面对操蛋的人生) wph_0000@hotmail.com ~~~~~~~~~~~~~~~~~~~~~ 2008-08-27 10:39:39 [已注销] hzhz86454975@sina.com 2008-08-27 12:12:23 D绮 (吃零食,是一种态度。) missdelbin@hotmail.com 2008-08-27 19:30:04 凌波 (只有迷路才能找到不能找到的路) huanglingbo001@yahoo.com.cn 2008-08-28 14:39:26 vicky (玻璃心,保存需细心) alalhuan@yahoo.com.cn 2008-08-28 14:52:16 疯丫头小瑶 moon-windy@163.com 2008-08-28 18:15:13 莳路美年 (月光塔主) lerrleth@163.com 2008-08-29 02:28:14 [已注销] chenjing-jingting@hotmail.com 2008-08-29 11:36:02 Whyya weasley.tao@gmail.com 2008-08-29 11:44:18 无敌铁金刚 lanshedexue@163.com 2008-08-29 14:25:15 花未眠 (乡巴佬花) woaiyeguangchao@126.com 2008-08-29 15:25:04 Sylar‖迫 (花开一季落一年 心开一次锁一生) kevin20@live.cn 2008-08-29 21:04:52 mywinds (我想牵着你的手,和你一起慢慢走) mywindslx@gmail.com 2008-08-29 22:47:19 象小喜 henashy@hotmail.com 2008-08-30 12:16:12 MM (好好学习,天天向上。) yigemumu@gmail.com 2008-08-30 15:29:21 小羽 (假如我不曾爱你 我不会失去自己) eeyang86@yahoo.com.cn 2008-08-30 23:20:16 飘柔 261433102@qq.com 2008-08-31 01:50:46 Gray13小灰 (一切都变了 变坏了) deutschland.gray@gmail.com 2008-08-31 21:20:17 Dangerfield ifengi@hotmail.com 2008-09-01 12:36:47 凝默。瞳 (慢生快活。) qsyr2939@126.com 2008-09-01 16:12:27 甲丁丁 wenwenconey@163.com 2008-09-01 20:25:32 舒子 (被嫌弃的舒子的一生。) tracydsy0401@163.com 2008-09-02 04:40:06 Al. (…) allie@yahoo.cn 2008-09-02 13:11:21 夏子 (❀别让人生 输给了心情❀) gwiewie@hotmail.com 2008-09-02 17:02:04 vivian sayhellotome_jj@sina.com 2008-09-03 02:06:06 lordsteven^圣 lordsteven@163.com 2008-09-03 10:00:25 乡村教育践行者 (凉山汉达社工) wolf54@163.com 2008-09-03 14:06:15 Nevinw (要拥有跟随内心与直觉的勇气) hiwljun#gmail.com 2008-09-03 19:36:19 已注销 luna77777@126.com 2008-09-03 22:49:50 无肠 (我的昨天埋在大街上,明天在梦里) franzchian@sina.com 2008-09-04 14:37:16 ( ̄(工) ̄) 太大犬雄 (来福) gasparjian@gmail.com 2008-09-04 19:13:11 ½luna (准备好,再一次,OK!) rockluna@gmail.com 2008-09-05 00:06:27 Summer (春暖花开。梦想不死。) yanjing19882006@126.com 2008-09-06 16:32:59 小不 (我女儿叫Nora…) genielucia@gmail.com 2008-09-08 11:10:49 jj kate123lalala@yahoo.com.cn 2008-09-08 17:57:07 糖.||. 叼根棒糖到处晃 purffy@126.com 2008-09-09 14:58:41 流浪的蘇途 jimolianan@163.com 闪 2008-09-09 16:54:29 kimim (笃初诚美,慎终宜令) jjmmma@gmail.com 2008-09-10 11:00:44 spark (LOVE YOU !) hm304@126.com 2008-09-10 11:58:07 MIKE (山之高,月出小,月之小,何皎皎) zbq56702@hotmail.com 2008-09-10 15:55:12 Y★ (半分がピンクで 半分はブルー) xxya74@sina.com 2008-09-10 16:01:36 一只蜗牛游啊游 (我的缺电人生) ganpiao@gmail.com 2008-09-11 13:15:33 安新年游乐园 alongdove@hotmail.com 2008-09-11 23:59:38 二果子 (DIY?) 100 2008-09-11 23:59:53 二果子 (DIY?) either@163.com 2008-09-12 20:06:07 !『♪`~環』 (我永远不能在QQ上看到你在线了) sliea_229@163.com 2008-09-13 00:57:14 meagloria (:D 😛 XD XP) mg_hysteria@hotmail.com 2008-09-13 03:39:45 Sam shoko@live.com.sg 2008-09-13 11:13:43 楠||偏执狂 kjn194@sohu.com 2008-09-13 21:24:27 starry (有谁痴情得 不怕天地变) enstarry23@163.com 2008-09-13 23:16:00 鼢 haha75390@163.com 2008-09-14 11:11:40 花朵儿 (什么是幸福,我概念模糊!) curry-246@163.com 2008-09-14 12:37:13 ( ̄(工) ̄) 太大犬雄 (来福) 我还要再玩… gasparjian@gmail.com 2008-09-14 21:28:05 狂欢de寂默 yaya_0205@126.com 2008-09-15 20:24:43 tee_water dl_love0718@163.com 2008-09-15 21:46:57 Miss Scorpion heartfeast@gmail.com 2008-09-15 22:54:11 北街old (北街) gaoweibin@gmail.com 2008-09-16 00:41:48 王抽抽 (别闹!) wangm_0204@yahoo.cn

OK 可能对于现在的你,有点难度? 不过我们从简单开始。

大家看到里面有个字母叫gmail。 那我要大家去匹配出gmail这个字母,那应该很简单了吧?

答案就是:你可以直接就用 gmail 作为正则表达式。 它可以精确匹配这样的字符串。它就是由五个字母组成,分别是 g m a i l。

但是如果我们里面有个单词叫gmailaddress的,那么会不会连这里面的gmail都匹配出来? 但是我们要的只是单独的一个gmail,不需要其他附带的东西。

那么我们就可以借助元字符。 \b是正则表达式规定的一个特殊代码。 代表着单词的开头或结尾,也就是单词的分界处。 虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。

为了方便测试我们的正则表达式,这里推荐大家使用.NET 4.5开发的一款正则表达式测试工具RegexTester.exe。

这个时候,如果我们要匹配,所有以e开头的gmail.com的邮箱呢? 我们就需要用到另外的元字符了,它们分别是:

  • . 是另一个元字符,匹配除了换行符以外的任意字符。
  • * 同样是元字符,不过它代表的不是字符,也不是位置,而是数量。它指定*前边的内容可以连续重复使用任意次以使整个表达式得到匹配,也就是0到n次。
  • + 也是元字符,它表1到n次,+*的区别就是+表示前面的字符至少出现一次。

所以,.*连在一起就意味着任意数量的不包含换行的字符。

所以我们可以把规则改为这样:e.*@mail.com

然而,你会发现,我们把一些错误内容也匹配出来了。 errorguo@gmail.com e@gmail.com easley.tao@gmail.com emumu@gmail.com eutschland.gray@gmail.com enielucia@gmail@com eartfeast@gmail.com eibin@gmail.com

大家想想为什么?

答案就在我们的.com的这个.了,还记得.的意思没有。 因为. 本身有特殊意义在里面。但是我们这里的gmail.com的.,是真真实实的一个.。 那么这种情况,就需要我们转义了。

所以,这个才是我们的规则:e.*@gmail\.com

匹配电子邮件的简易正则:

.+@.+\.\w+

我们再来看一个例子,匹配固话。

中国的固话格式: xxxx-xxxxxxxx 前面是区号,由3到4个数字组成,比如010、020、0755。 第二个是电话号码,由7或者8位数字组成。

这里我们再来学一个元字符,那就是\d,它代表0-9这十个数字。

所以,大家试一下,去写一下这个正则:

0\d{2,3}-\d{7,8}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注