简介

  • 正则表达式时一种强大而灵活的文本处理工具,用于文本的复杂处理

  • 正则表达式就是描述了一个规则,通过这个规则可以匹配一类字符串

语法

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

  2. 简单的转义字符

    1
    2
    3
    4
    5
    6
    7
    \n		代表换行符

    \t 代表制表符

    \\ 代表\本身

    还有一些特殊的字符表达
  3. 标准字符集合

    1
    2
    3
    4
    5
    6
    7
    8
    \d		任意一个数字

    \w 任意一个字母,数字或下划线

    \s 包括空格,制表符,换行符等空白字符的其中任意一个

    . 小数点可以匹配任意一个字符(除了换行符)
    注意大小写,若是大写则代表相反的意思,比如 \D 表示除了数字之外的字符
  4. 自定义字符集合

    • 方括号的匹配方式,能够匹配方括号中任意一个字符,比如

      1
      2
      3
      [123]		匹配1,2,3字符
      [2-8] 匹配2~8的数字
      [ ^123 ] 匹配除了1,2,3之外的字符
    • 正则表达式的特殊符号被包含到中括号中则失去特殊意义,除了^,-之外

    • 标准字符集合,除小数点外,如果被包含于中括号,自定义字符集合将包括该集合,比如

      1
      [\d.\-+]		匹配数字,小数点,+,-
  5. 量词

    1
    2
    3
    4
    {n}					重复n次
    {m,n} 至少重复m次,最多重复n次
    匹配的时候默认的是贪婪模式,意思为能匹配多的就匹配多的
    非贪婪模式,匹配字符越少越好,修饰匹配次数的特殊符号后加一个“?”
  6. 字符边界

    1
    2
    3
    4
    5
    		把一整个文本当成一个字符串

    ^ 与字符串开始的地方匹配
    $ 与字符串结束的地方匹配
    \b 匹配一个单词边界,即前面和后面的字符不全是\w
  1. 选择符和分组

    1
    2
    3
    4
    |				或,表示匹配左边或右边
    ( ) 捕获组,可以保存捕获的内容,并从1开始编号
    (?: ) 非捕获组,表示不需要保存捕获的内容
    反向引用 每一对()会分配一个编号,使用()根据左括号开始从1编号,通过反向引用可以对分组已捕获的字符串进行引用,比如\1会表示第一个捕获组的内容
  2. 预搜索(零宽断言)

    1
    2
    3
    4
    5
    零宽断言表示一种零宽度的匹配,匹配的是一个位置
    (?=exp) 断言自身出现的位置后面有表达式exp
    (?!exp) 断言此位置的后面不能有表达式exp
    (?<=exp) 断言自身出现的位置前面有表达式exp
    (?<!exp) 断言此位置的前面不能有表达式exp

匹配模式

  1. IGNORECASE

    忽略大小写模式,即匹配时忽略大小写

  2. SINGLELINE

    单行模式,整个文本看作一个字符串

  3. MULTILINE

    每行都是一个字符串,如果需要匹配最开始和结束的位置,可以用\A和\Z

Java中使用正则表达式

在Java中使用正则主要是java.util.regex包地Pattern和Matcher类

类Pattern

  1. 正则表达式的编译表示形式

类Matcher

  1. 通过解释Pattern对character sequence执行匹配操作的引擎

  2. 1
    Matcher m = p.matcher(str) ; 		//匹配str字符串

一个简单地使用

1
2
3
4
5
6
7
// 一个简单的使用
Pattern p = Pattern.compile("\\w+");
Matcher m = p.matcher("asjdhjksa234qw") ;
boolean flag = m.matches(); //尝试将整个字符序列与该模式匹配
// 符合则flag为true,反之为false
flag = m.find(); //扫描输入的序列,查找该模式匹配的下一个子序列
String res = m.group(); //返回找到的子序列