正则表达式

Posted tiechui2015

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。

1.正则表达式:普通字符和元字符(特殊字符)组成的【模式】
2.特殊字符:
  【.】匹配除 "\n" 之外的任何单个字符。
       要匹配包括 ‘\n‘ 在内的任何字符,请使用象 ‘[.\n]‘ 的模式。
  【\w】匹配包括下划线的任何单个单词字符。等价于‘[A-Za-z0-9_]‘。
  【\W】匹配任何单个非单词字符。等价于 ‘[^A-Za-z0-9_]‘。
  【\d】匹配一个数字字符。等价于 [0-9]。
  【\D】匹配一个非数字字符。等价于 [^0-9]。
  【\n】匹配一个换行符。等价于 \x0a 和 \cJ。
  【\r】匹配一个回车符。等价于 \x0d 和 \cM。
  【\s】匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]。
  【\S】匹配任何非空白字符。等价于 [^\f\n\r\t\v]。
  【\t】匹配一个制表符。
  【\b】匹配一个单词边界,也就是指单词和空格间的位置。
        例如, ‘er\b‘ 可以匹配"never" 中的 ‘er‘,但不能匹配 "verb" 中的 ‘er‘。
                      可以匹配"never!"中的‘er‘,即\b是单词末尾
  【\B】匹配非单词边界。‘er\B‘ 能匹配 "verb" 中的 ‘er‘,但不能匹配 "never" 中的 ‘er‘。
  【^】 匹配输入字符串的开始位置。
        如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n‘ 或 ‘\r‘ 之后的位置。
        ^is即匹配字符串开始位置的is。
        "this is ..."中无法匹配  
        "is this is"则可以匹配开头的一个is,后续的不匹配
  【$】    匹配输入字符串的结束位置。
        正则"abzz$"  匹配字符串:"abzz"  不匹配  "abzzaa"
  【*】匹配之前的子表达式0或多次  ‘ab*‘ 匹配 abbbb  abb   ab  a
                                  ‘(ab)*‘ 匹配 abab  ababab 如果没有ab则也算匹配,但未匹配到内容
  【+】匹配之前的子表达式1或多次  ‘ab+‘ 匹配 abbbb  abb   ab
  【?】    匹配前面的子表达式零次或一次。  ‘ab?‘ 匹配 ab a
        例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 0,1。
  【n】n 是一个非负整数。匹配确定的 n 次。
         例如,‘o2‘ 不能匹配 "Bob" 中的 ‘o‘,但是能匹配 "food" 中的两个 o。
               ‘(oo)2‘ 匹配fooood
  【n,】n 是一个非负整数。至少匹配n 次。
          例如,‘o2,‘ 不能匹配 "Bob" 中的 ‘o‘,
          但能匹配 "foooood" 中的所有 o。‘o1,‘ 等价于 ‘o+‘。‘o0,‘ 则等价于 ‘o*‘。
  【n,m】m 和 n 均为非负整数,其中n <= m。
           最少匹配 n 次且最多匹配 m 次。
           例如,"o1,3" 将匹配 "fooooood" 中的前三个 o。‘o0,1‘ 等价于 ‘o?‘。
           请注意在逗号和两个数之间不能有空格。(is)(1,5?)@is
  【?】当该字符紧跟在任何一个其他限制符 (*, +, ?, n, n,, n,m) 后面时,
       匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,
       而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
       例如,对于字符串 "oooo",‘o+?‘ 将匹配单个 "o",而 ‘o+‘ 将匹配所有 ‘o‘。
             对于字符串 "isisd" (is)1,5?d 匹配 isisd
             如上误区:大家会误认为应该匹配isd而不是isisd。
             正解:正则先匹配到一个串,如果是贪婪模式的话会尝试继续向右探索是否可以匹配更长
                   正则先匹配到一个串,如果是非贪婪模式,则不会继续向右探索。
                   所以,(is)1,5?d先匹配到isisd,由于是非贪婪模式所以不再向右探索
                   贪婪与否是在匹配到第一个字串后,是否继续向右继续探索
       根据正解,在看一个实例:
       对于字符串"isxxxdasdfsfd"  正则:is.*d 匹配isxxxdasdfsfd
                                        正则:is.*?d 匹配isxxxd

  【(?!exp)】i\w(?!d) 匹配"xxxiadzzaicc" 中的"ic"
           匹配后面跟的不是exp的位置,exp不匹配内容
           ia(?!c)   abcdedfiacsdffdfiab
  【(?<!exp)】(?<!d)i\w  匹配"xxdiabzzaicc" 中的"ic"
           匹配前面不是exp的位置,表达式不匹配内容
  【(?=exp)】i\w(?=d)   匹配"xxiadxxxibc"中的"ia"
           匹配后面跟的是exp的位置,exp不匹配内容
  【(?<=exp)】(?<=d)i\w  匹配"xxdiaxxxbic"中的"ia"
           匹配前面跟的是exp的位置,exp不匹配内容
  【(?i)】表示不区分大小写
            (?i)abc 表示abc都忽略大小写   aBc ABC abC ABC
            a(?i)bc 表示bc忽略大小写
            a((?i)b)c 表示只有b忽略大小写
  【[]】是定义匹配的字符范围。
        比如 [a-zA-Z0-9_] 匹配任意一个英文字符和数字和下划线,等价于【\w】
             [a-z]匹配任意一个所有小写英文字符
             a[0-9]b匹配a1b   a2b  
             a[0-9]+b 匹配 a1b  a359b   a23495739857987985b
             [^a-c] 匹配除了a b c之外的字符(在中括号中的【^】是【非】的意思)
=========================================================================================================
java正则:
    Pattern类:
        pattern对象是一个正则表达式的编译表示。Pattern类没有公共构造方法。
        Pattern p=Pattern.compile("abc");需要调用compile获得。
    Matcher类:
        Matcher对象是对输入字符串进行解释和匹配操作的引擎。与Pattern类一样,
        Matcher也没有公共构造方法。你需要调用Pattern对象的matcher方法来获得一个Matcher对象。
    PatternSyntaxException:
        PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
    
    //模式对象
    Pattern p=Pattern.compile("abc");
    //匹配对象:负责用模式对象 匹配 字符串=abcdef123456
    Matcher matcher = p.matcher("abcdef123456");
    while(m.find())//find()从上次查找的位置之后继续向后查找与模式Pattern匹配的一个字符(串),第一次从第一个字符开始
        System.out.println(m.group());//本次查找匹配到的内容
    
    System.out.println(m.find(10));//从索引为10的位置开始查找一个与模式匹配的字符(串)
    System.out.println(m.group());//find(10)所匹配到的字符
    
    
JS正则:
      var str="Is this all there is?";
      //声明正则对象【/xxxx/】
      var patt1=/is/gi;//g=全局匹配   i=忽略大小写
      str.match(patt1);//查找是否含有匹配的字符,没有返回null
      patt1.exec("The best things in life are free")//查找是否含有匹配的字符,没有返回null
      var patt1=/[abc]/;
      patt1.test("The best things in life are free");//return true;没有返回false
      
      
      var regu =/^[1][3][0-9]9$/;
      console.log("13101161911".match(regu));
      console.log(regu.exec("18301161911"));
      console.log(regu.test("18301161911"));

以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

PHP 正则表达式总结

正则表达式

正则表达式

正则表达式“或“的使用

正则表达式 验证数字格式 非负数 小数点后保留两位 数字正则 double正则

JS正则表达式详解