正则表达式

正则表达式经常被简称为模式,它们其实是一些由字符构成的字符串。正则使用的场景,不外乎两种情况:一种是查找特定的信息(搜索),另一种是查找并编辑特定的信息(替换)。给定一个正则表达式,它要么匹配一些文本(进行一次搜索),要么匹配并替换一些文本(进行一次替换)。

匹配单个字符

  • 1、.字符可以匹配任何一个单个的字符。

  • 2、\是一个元字符,\字符永远出现在一个有着特殊含义的字符序列的开头,这个序列可以由一个或多个字符构成。

匹配一组字符

  • 1、使用[和]定义的字符集合里,这两个元字符之间的所有字符都是该集合的组成部分,字符集合的匹配结果是能够与该集合里的任意一个成员相匹配的文本。
    利用[Rr]eg[Ee]x能够匹配出regex、Regex、regEx、Regex。

  • 2、字符集合区间

    • [0-9] 等价于 [0123456789] ,匹配一个数字。
    • A-Z,匹配从A到Z的所有大写字母。
    • a-z,匹配从a到z的所有小写字母。
    • A-F,匹配从A到F的所有大写字母。
  • 3、取非匹配。使用^字符来表明你想对一个字符集合进行取非匹配。它的作用是除了那个字符集合里的字符,其他字符都可以匹配。
    比如:[^0-9]可以匹配一个任何不是数字的字符。

注意:
1、在定义字符区间时,一定要避免让这个区间的尾字符小于它的首字符(例如[3-1])。这种区间没有意义,而且往往会让整个模式失效。
2、-(连字符)是一个特殊的元字符,作为元字符它只能用在[和]之间。在字符集以外,-是普通字符,只与自身匹配。

使用元字符

元字符是一些在正则表达式里有着特殊含义的字符。英文句号(.)、左方括号[、右方括号]等都是元字符。如果不对元字符进行转义,那么我们就无法匹配到像以上几个元字符的本身,这就是我们需要转义的原因。

  • 1、对特殊字符进行转义。转义符号前面提到过,是\。任何一个元字符都可以通过给它加上一个反斜杠字符作为前缀的方法来转移。
    配对的元字符不用做元字符时必须被转义,否则系统会抛出异常。

  • 2、常用元字符
    代码           说明
    .             匹配除换行符以外的任意字符
    \w             匹配字母或数字或下划线或汉字
    \s             匹配任意的空白符
    \d             匹配一个数字
    \b             匹配单词的开始或结束
    ^             匹配行的开始
    $             匹配行的结束

  • 3、常用反义元字符
    代码   说明
    \W      匹配任意不是字母,数字,下划线,汉字的字符
    \S       匹配任意不是空白符的字符
    \D      匹配任意非数字的字符
    \B       匹配不是单词开头或结束的位置
    [^x]      匹配除了x以外的任意字符
    [^aeiou]   匹配除了aeiou这几个字母以外的任意字符

  • 4、常用重复限定符
    代码       说明
    *         重复零次或更多次
    +         重复一次或更多次
    ?         重复零次或一次
    {n}       重复n次
    {n,}       重复n次或更多次
    {n,m}      重复n到m次

重复匹配

  • 1、+ 匹配一个或多个字符。
    要想匹配同一个字符(或字符集)的多次重复,只要简单的给这个字符(字符集)加上一个+字符作为后缀就行了。+匹配一个多多个字符(至少一个字符,不包括零个字符的情况。)

  • 2、一般来说,当在字符集合里使用元字符时,像 .+ 这样的元字符将被解释为普通字符,不需要被转义,但是转义了也没有坏处,也不会出错,效果是一样的。

  • 3、*匹配零个或多个字符。* 的用法和 +完全一样,区别是*匹配的是零个或多个字符。

  • 4、? 匹配零个或一个字符。这也是一个比较常用的元字符是

  • 5、匹配的重复次数。

    • 为匹配的次数设定一个重复的值。在字符或字符集后面加上{3},意思是重复匹配三次。
    • 为重复匹配次数设定一个区间。在字符或字符集后面加上{2,4},意思是重复匹配二到四次。
    • 匹配至少重复多少次。在字符或字符集后面加上{3,},意思是至少重复三次,与之等价的说法是,“必须重复三次或更多次。”

匹配位置

  • 1、\b来匹配单词的开始或结尾。通过\b,我们可以设置要匹配单词的边界,避免过度匹配。\b只匹配一个位置,不匹配任何字符。

  • 2、字符串边界。字符串边界有两个,一个是用来定义字符串开头的^,一个是用来定义字符串结束的$

使用子表达式

  • 1、子表达式(),就是用()把表达式括起来,构成独立元素要使用。比如,( ){2,}。

  • 2、如有必要,子表达式还可以嵌套。

回溯引用:前后一致匹配

回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式。

  • 1、回溯引用匹配

    • 如:[ ] +(\w+)+[ ]+\1。 \1代表什么?它代表模式里的第一个字表达式;\2就代表模式里的第二个字表达式,\3代表第三个,依次类推。
    • 回溯引用匹配通常从1开始计数。在许多实现里,第0个匹配\0可以用来代表整个正则表达式。
    • 但是这种子表达有很大的缺点,如果匹配的子表达式位置发生了变化,这就将导致整个匹配的失败。
    • 回溯用法在不同的正则表达式实现里有很大的差异:javascript用户需要用$来代替\。
  • 2、大小写转换
    用力进行大小写转换的元字符

    • \E 结束\L或\U转换
    • \l 把下一个字符转换为小写
    • \L 把\L到\E之间的字符全部转换为小写
    • \u 把下一个字符转换为大写
    • \U 把\L到\E之间的字符全部转换为大写

前后查找

  • 1、向前查找
    ?=开头,需要匹配的文本跟在=的后面。在向前查找中,被匹配的文本不包含在最终返回的匹配结果中。

  • 2、向后查找
    ?<=开头,向后查找模式只能是固定长度,而向前查找模式的长度是可变的。

  • 3、把向前查找和向后查找结合起来。
    向前查找和向后查找可以组合在一起使用。

//文本
<head>
      <title>Ben Forta's Homepage</title>
</head>

//正则表达式
<?<=\<[tT][iI][tT][lL][eE]>).*<?=\</[tT][iI][tT][lL][eE]>).*

//结果
Ben Forta's Homepage
  • 4、对前后查找取非
    • (?=) 正向前查找。将向前查找与给定模式相匹配的文本。
    • (?!) 负向前查找。将向前查找不与给定模式相匹配的文本。
    • (?<=) 正向后查找。将向后查找与给定模式相匹配的文本。
    • (?<!) 负向后查找。将向后查找不与给定模式相匹配的文本。

常见问题的正则表达式解决方案

  • 1、中国固定电话号码。对应的正则表达式可以写为:
    \(?0[1-9]\d{1,3}\)?[-]?[2-9]\d{2,3}[-]?\d{4}

  • 2、北美电话号码。
    \(?[2-9\d\d\)]?[ -]?[2-9]\d\d-\d{4}
    稍微改改就能匹配北美电话的其他格式。

  • 3、IP地址
    (((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
    这个模式只做到了匹配合法的IP,不匹配不合法的IP。

  • 4、URL地址
    简单的情况下,你的URL匹配模式至少应该匹配到以下内容:协议名(http或https)、一个主机名、一个可选的端口号、一个文件路径。正则表达式匹配如下:
    http?://[-\w.]+(:\d+)?(/[\w/_.]*)?)?

  • 5、完整的URL地址
    它还可以匹配URL查询字符串(嵌在URL地址里的变量信息,这些信息与URL地址中的网址部分要用一个?隔开)以及可选的用户登录信息。
    https?://(\w*:\w@)?[-\w.]+(:\d+)?(/([\w/_.]*(\?\S+)?)?)?
    这个比较完备,但处理速度比较慢,没有必要的时候,建议不用。

  • 6、电子邮件地址
    (\w+\.)*\w+@(\w+\.)+[A-Za-z]+

  • 7、HTML注释
    <!-{2,}.*?-{2,}>

  • 8、JavaScript注释
    .*

  • 9、使用正则表达式验证邮箱格式

var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$/;
   var email = "example@qq.com";
   console.log(reg.test(email));  // true  
  • 10、写一个function,清除字符串前后的空格。(兼容所有浏览器)
function trim(str) {
    if (str && typeof str === "string") {
        return str.replace(/(^\s*)|(\s*)$/g,""); //去除前后空白符
    }
}

2017-11-21 正则表达式学习完成

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 正则表达式到底是什么东西?字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等...
    狮子挽歌阅读 2,136评论 0 9
  • 推荐几个正则表达式编辑器 Debuggex :https://www.debuggex.com/ PyRegex:...
    木易林1阅读 11,458评论 9 151
  • 几个正则表达式编辑器 Debuggex :https://www.debuggex.com/ PyRegex:ht...
    没技术的BUG开发攻城狮阅读 4,581评论 0 23
  • 初衷:看了很多视频、文章,最后却通通忘记了,别人的知识依旧是别人的,自己却什么都没获得。此系列文章旨在加深自己的印...
    DCbryant阅读 3,981评论 0 20
  • 注:本篇文章只为方便查看,特此保留,如有冒犯,敬请谅解!!! 本文目标 30分钟内让你明白正则表达式是什么,并对它...
    阿杰Alex阅读 1,476评论 0 10