跳转至

关于正则表达式

约 1135 个字 预计阅读时间 4 分钟

介绍

正则表达式是一个具有特殊规则的字符串,一般用于校验输入的数据,例如电话号码,QQ号等

String类中,有一个方法可以判断字符串是否匹配参数的正则表达式:boolean matches(String regex)

Note

一般可以使用网站生成对应的正则表达式,例如:正则表达式生成

基本语法

正则表达式的基本语法如下:

基本匹配

  • .:匹配除换行符以外的任意单个字符
  • [...]:字符集,[]表示一个区间,范围可以自己定义。表示匹配方括号中任意一个字符。例如[abc]匹配"a"、"b"或"c"
  • [^...]:否定字符集,匹配任何不在方括号中的字符。例如[^abc] 匹配任何不是"a"、"b"或"c"的字符
  • \d:匹配任意数字,等同于[0-9]
  • \D:匹配任意非数字字符,等同于[^0-9]
  • \w:匹配任意字母、数字或下划线,等同于[a-zA-Z0-9_]
  • \W:匹配任意非字母、数字或下划线字符,等同于[^a-zA-Z0-9_]
  • \s:匹配任意空白字符,包括空格、制表符、换行符等
  • \S:匹配任意非空白字符
  • \n:匹配换行符
  • \r:匹配回车符
  • \t:匹配制表符
  • \b:匹配单词边界
  • \B:匹配非单词边界
  • ^:匹配字符串的开头
  • $:匹配字符串的结尾

Note

字符与字符之间没有其他符号时,每一个字符之间为或的关系

每一个[]匹配一个字符,多个[]并列匹配多个字符

语法示例:

  1. [abc]:代表a或者b或者c字符中的一个
  2. [^abc]:代表除abc以外的任何字符
  3. [a-z]:代表a-z的所有小写字符中的一个
  4. [A-Z]:代表A-Z的所有大写字符中的一个
  5. [0-9]:代表0-9之间的某一个数字字符
  6. [a-zA-Z0-9]:代表a-z或者A-Z或者0-9之间的任意一个字符
  7. [a-dm-p]admp之间的任意一个字符

量词 (Quantifiers)

  • *:匹配前面的元素零次或多次。例如a*匹配零个或多个"a"
  • +:匹配前面的元素一次或多次。例如a+匹配一个或多个"a"
  • ?:匹配前面的元素零次或一次。例如a?匹配零个或一个"a"
  • {n}:匹配前面的元素恰好n次。例如a{3}匹配"aaa"
  • {n,}:匹配前面的元素至少n次。例如a{2,}匹配两个或更多"a"
  • {n,m}:匹配前面的元素至少n次,但不超过m次。例如a{2,4}匹配"aa"、"aaa" 或"aaaa"
  • *?, +?, ??, {n,}?, {n,m}?:非贪婪量词,尽可能少地匹配

分组与捕获 (Grouping and Capturing)

  • (...):分组,将括号内的表达式视为一个整体,并捕获匹配的内容
  • (?:...):非捕获分组,将括号内的表达式视为一个整体,但不捕获匹配的内容,如果内部有捕获组,则意味着不为自己创建捕获组,但内部的捕获组仍然有效
  • \1, \2, ...:反向引用,匹配前面捕获组捕获到的内容

或操作 (Alternation)

  • |:或操作符,匹配|左边或右边的表达式。例如a|b匹配"a"或"b"
  • &&:并且操作符,匹配同时符合&&左侧和右侧的表达式。例如[[a]&&[^b]]匹配有a且没有b

Note

需要注意,使用&&连接两个区间需要在外侧使用一对[]包裹该部分,如果不写任何逻辑运算符

转义字符 (Escape Characters)

  • \:用于转义特殊字符,使其被视为普通字符。例如\.匹配实际的点字符"."

断言 (Assertions)

  • (?=...):正向先行断言 (Positive Lookahead),匹配后面跟着...的位置
  • (?!...):负向先行断言 (Negative Lookahead),匹配后面不跟着...的位置
  • (?<=...):正向后行断言 (Positive Lookbehind),匹配前面是...的位置
  • (?<!...):负向后行断言 (Negative Lookbehind),匹配前面不是...的位置

模式修饰符 (Pattern Modifiers/Flags)

  • i:忽略大小写 (Case-insensitive)
  • g:全局匹配 (Global match),查找所有匹配项,而不是在找到第一个匹配项后停止
  • m:多行匹配 (Multiline),使^$匹配每一行的开头和结尾,而不仅仅是整个字符串的开头和结尾
  • s (或.的dotall模式): 使.匹配包括换行符在内的所有字符

正则表达式在不同语言中的使用

  1. Java:见Java网络编程、正则表达式、单例设计模式与Lombok
  2. JavaScript:见JavaScript内建对象
  3. C++:见C++ 11相关新特性