正则表达式

时间:2024-01-24 19:03:18

  

1.什么是正则表达式?

  正则表达式,又称规则表达式(Regular Expression,在代码中常简写为regex、regexp或re)。它是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。在大部分语言、数据库中都支持正则表达式。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

2.正则表达式的用处

  1.验证给定字符串是否符合指定特征,比如验证Email是否合法。
  2.用来查找字符串,从一个长的文本中查找符合指定特征的字符串。
  3.用来替换,替换给定字符串中符合指定特征的部分

3.正则表达式规则

  3.1.普通字符

    字母、数字、汉字、下划线、以及没有特殊定义的标点符号,都是“普通字符”。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。

  3.2转译字符

   

  3.3标准字符集合

  标准字符集合可以匹配集合中所有字符

  

  注:"\d"、"\w"、"\s"区分大小写,大写时为取反,即匹配不在集合中的字符

 

  3.4自定义字符集合

用[ ]方括号括起来的即为自定义字符集合,能够匹配方括号中任意一个字符。
  例:[ab5@]:匹配 "a" 或 "b" 或 "5" 或 "@" 。
    [^abc]:匹配 "a","b","c" 之外的任意一个字符 。
    [f-k]:匹配 "f"~"k" 之间的任意一个字母 。
    [^A-F0-3]:匹配 "A"~"F","0"~"3" 之外的任意一个字符。

注:1.正则表达式中的特殊符号,如果被包含于中括号中,则失去特殊意义,仅代表该字符本身( \ [ ] : ^ - 除外)。
  2. 标准字符集合,除小数点(.)外,如果被包含于中括号中,自定义字符集合将包含该集合。比如:[\d.\-+],将可以匹配数字,小数点和 + - 符号。(小数点和 + 号失去特殊意义)

  3.5 修饰匹配次数的特殊符号

  

  3.6贪婪模式和非贪婪模式

在匹配次数中分为贪婪模式和非贪婪模式。(默认为贪婪模式,在在修饰匹配次数的特殊符号后再加上一个 "?" 号就为非贪婪模式)
贪婪模式(匹配字符越多越好):
  “{m,n}”, “{m,}”, “?”, “*”, “+”,具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。
非贪婪模式(匹配字符越少越好)
  在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 "不匹配"。

  3.7字符边界

    字符边界匹配的不是字符而是位置(符合某种条件的位置)。

  

  3.8选择符 “|”

    “|”左右两边表达式之间 存在"或" 关系,即匹配左边或者右边。

  3.9 分组“()”

    1.在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰。
    2.取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到。
    3.每一对括号会分配一个编号,使用 () 的捕获根据左括号的顺序从 1 开始自动编号。(可以用\编号再次匹配那个分组的内容)

4.匹配模式(C)

  IGNORECASE 忽略大小写模式
    – 匹配时忽略大小写。
    – 默认情况下,正则表达式是要区分大小写的。
  SINGLELINE 单行模式
    – 整个文本看作一个字符串,只有一个开头,一个结尾。
    – 使小数点 "." 可以匹配包含换行符(\n)在内的任意字符。
  MULTILINE 多行模式
    – 每行都是一个字符串,都有开头和结尾。
    – 在指定了 MULTILINE 之后,如果需要仅匹配字符串开始和结束位置,可以使用 \A 和 \Z

5.常用正则表达式总结

  匹配联系方式
    (0\d{2,3}-[1-9]\d{6,7})|(1[35678]\d{9})

  匹配手机号码
    ^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$

  匹配正常的QQ号码
    [1-9][0-9]{4,11}

  匹配贵族QQ号码
    abcxxabc
      (\d{3})\d{2}\1
    xxxxabab
      \d{4}(\d{2})\1
    xxxxabcdxxxxdcba
      (\d{3,5})(\d)(\d)(\d)(\d)\1\5\4\3\2
    匹配邮箱
      \w{6,18}@\w{2,10}(\.\w{2,3}){1,3}
    匹配18-60
      (1[89])|([2-5]\d)|(60)

  匹配身份证18位
    ^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$
  匹配汉字
    [\u4e00-\u9fa5]

  匹配日期
    \d{4}-(((0?[13578]|1[02])-(0?[1-9]|[12][0-9]|3[01]))|((0?[469]|11)-(0?[1-9]|[12][0-9]|30))|(0?2-(0?[1-9]|[12][0-9])))

    \d{4}-(((0[1-9]|1[0-2])-(0[1-9]|[12]\d))|((0[13-9]|1[0-2])-30)|((0[13578]|1[02])-31))

    29
      (0[1-9]|1[0-2])-(0[1-9]|[12]\d)
    30
      (0[13-9]|1[0-2])-30
    31
      (0[13578]|1[02])-31

  匹配IP
    ^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])(\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)){3}$

6.在Java使用正则表达式

  类 Pattern:

    正则表达式的编译表示形式。
      Pattern p = Pattern.compile(r,int); //建立正则表达式,并启用相应模式

  类 Matcher:

     通过解释 Pattern 对字符串执行匹配操作的引擎
      Matcher m = p.matcher(str); //匹配str字符串
        matches() find() reset() group()

  编程中使用正则表达式常见情况:

验证表达式是否匹配整个字符串
验证表达式是否可以匹配字符串的子字符串
返回给定字符串中匹配给定正则表达式所有子字符串
替换给定字符串中匹配正则表达式的子字符串
根据正则表达式定义规则截取字符串

7.在JavaScript使用正则表达式

  Javascript中正则表达式对象的创建

    re = /pattern/[“flags”]  var re1 = /\d{3}/ig;
    re = new RegExp("pattern",["flags"])  var re2 = new RegExp("\\d{3}","ig");
    Flags可选项常见值:
      g (全文查找出现的所有pattern)
      i (忽略大小写)

  RegExp对象常用方法:

    exec(): 返回的是一个数组。该数组包含了匹配该模式的第一个子字符串以及该子字符串中匹配相关分组的字符串。比如:
      var re = new RegExp("(\\d+)([a-z]+)","ig");
      var result = re.exec("33ff55tt77uu88yy");
      返回的数组为:[33ff,33,ff]
    test(): 返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式匹配的子字符串

  字符串中常用的使用正则表达式的方式:

    match():使用正则表达式模式对字符串执行查找,并将符合该模式的所有子字符串包含到数组中返回。
      var re = new RegExp("(\\d+)([a-z]+)","ig ");
      var t = "33ff55tt77uu88yy".match(re);
      结果为数组:[33ff,55tt,77uu,88yy]
    search(): 返回与正则表达式查找内容匹配的第一个子字符串的位置
    split(regex):按照指定的模式切割字符串,返回一个数组。
      var t = "asdfd33ff55tt77uu88yy".split(/\d+/);
    replace():
      var t = "asdfd33ff55tt77uu88yy".replace(/\d+/g ,"**"); 注意:这种用法,正则表达式对象的模式必须为global模式。否则只替换第一个子字符串