zoukankan      html  css  js  c++  java
  • 正则表达式学习(二)

    参考:正则表达式30分钟入门教程

    (很好用的)正则表达式在线测试  (英文)

    五、字符类(由"["和"]"括起来的,用于匹配其中任意一个字符)

    也可以表示范围,如[0-9],[a-zA-Z]

    六、转义字符,使用元字符本身时需要转义,如“(”和")"和“/”“^”"$"。

    在字符类即[ ]里面,使用元字符时不需要转义。匹配一个元字符:

    [()/^$]

    七、分支条件

    正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。

    注意:匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。

    八、分组

    由"("")"  所指定的子表达式。

    用途一:分组能够实现 子表达式 的重复

    ((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)
    匹配一个正确的IP地址

    用途二:在JS关于正则表达式的方法exec()、match(),在成功匹配字符串时,会返回字符串数组(整个字符串、子表达式字符串......)

    1 var reg = /((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)/
    2 
    3 123.123.123.123".match(reg)
    4 #Array(4) [ "123.123.123.123", "123.", "123", "123" ]
    5 
    6 reg.exec("225.255.254.255")
    7 #Array(4) [ "225.255.254.255", "254.", "254", "255" ]

    九、反义

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

    十、零宽断言

    JS仅支持正向零宽断言,不支持负向(ES7的建议)(终于是正则表达式的大难点到了,真的难懂也难解释)。

    (?=exp)匹配exp前面的文本

    (?:exp)匹配exp,不捕获匹配的文本,也不给此分组分配组号、

    (?!exp) 匹配后面不是exp的文本。不消费任何字符。

    十一、贪婪与懒惰

    懒惰限定符
    代码/语法说明
    *? 重复任意次,但尽可能少重复
    +? 重复1次或更多次,但尽可能少重复
    ?? 重复0次或1次,但尽可能少重复
    {n,m}? 重复n到m次,但尽可能少重复
    {n,}? 重复n次以上,但尽可能少重复

     

    十二、通过标志进行高级搜索

    正则表达式标志
    标志描述
    g 全局搜索。
    i 不区分大小写搜索。
    m 多行搜索。
    y 执行“粘性”搜索,匹配从目标字符串的当前位置开始,可以使用y标志。

    十三、 JS replace()

    stringObject.replace(regexp/substr,replacement)
    $$ Inserts a "$".(插入一个'$'字符)
    $& Inserts the matched substring.(插入匹配的子字符串)
    $` Inserts the portion of the string that precedes the matched substring.(插入匹配的子字符串左侧文本)
    $' Inserts the portion of the string that follows the matched substring.(插入匹配的字符串右侧文本)
    $n Where n is a positive integer less than 100, inserts the nth parenthesized submatch string, provided the first argument was a RegExp object. Note that this is 1-indexed.(与 regexp 中的第 1 到第 99 个子表达式相匹配的文本)

    用法:

    1 var re = /(w+)s(w+)/;
    2 var str = 'John Smith';
    3 var newstr = str.replace(re, '$2, $1');
    4 console.log(newstr);  // Smith, John

    一道很好的题:

    给数字每三位添加一个逗号

    1  var str = '1234567890';
    2  str = str.replace(/(d{1,3})(?=(?:d{3})+(?!d))/g,'$1,');

     简要解释:这里(d{1,3}) 表示匹配一位到三位数字的一串字符,而(?=(?:d{3})+(?!d))表示匹配三的整数倍的数字且不以数字结尾的一串字符(注意(?!exp)不消费字符,如“123”也属于d+(?!d)能匹配到的字符串)。

    所以如果是一串数字进行匹配的话,一次匹配就匹配到字符串前面的一到三位。

    如:“123456” 匹配到“123”,而“1234567”则匹配到“1”而已。

    开启全局匹配(g)后,“1234567”进行两次匹配,匹配到“1”、“234”,而这些都是第一个子表达式(即(d{1,3}))匹配到的,故使用参数‘$1’表示匹配到的内容。

  • 相关阅读:
    linux 里 /etc/passwd 、/etc/shadow和/etc/group 文件内容解释
    IIS 7.5 配置 php 5.4.22 链接 sql 2008(用PDO链接数据库)
    如何学好一本编程语言
    从零开始学YII2.0
    android AlertDialog 错误 OnClickListener 报错
    胖哥从零开始做一个APP系列文章的通知
    引用自定义控件出现的问题
    java hashMap实现原理
    粗略读完opengl
    求知若饥,虚心若愚
  • 原文地址:https://www.cnblogs.com/dayofcoder/p/10764624.html
Copyright © 2011-2022 走看看