正则表达式入门

143 阅读3分钟

1. 入门

1.1 元字符
代码说明
.匹配除换行符以外的任意字符
\w匹配字母或数字或下划线或汉字
\d匹配数字
\s匹配任意的空白符
\b匹配单词的开始或结束
匹配字符串的开始
$匹配字符串的结束
1.2 字符转义

​ 如果需要使用元字符的原本含义,在字符前面加‘\’。

1.3 重复

​ 指定需要匹配的任意次数。

代码说明
*匹配零次或更多次
+匹配一次或更多次
?匹配零次或一次
{n}匹配n次
{n+}匹配n次或更多次
{n,m}匹配n到m次
1.4 字符类

​ 匹配一类字符,需要用方括号列出来就可以。例如[aeiou]匹配元音字母。

1.5 分枝条件

​ 类似于或,用‘|’隔开每一个条件,符合其中任意的一种模式都应该当成一种匹配。

1.6 分组

​ 可以把一个模式用小括号来指定成一个分组,可以再分组后指定匹配的次数,就像(\d{1,3}){3}。

1.7 反义

​ 顾名思义,类似于反义词。

代码说明
\W匹配任意不是字母、数字、下划线
\S匹配任意不是空白符的字符
\D匹配任意不是数字的字符
\B匹配不是单词开头或结束的位置
[^x]匹配除了x以外的任意字符
[^aeiou]匹配除了aeiou这几个字母以外的任意字符
1.8 后向引用

​ 使用小括号指定了一个子表达式以后,匹配这个字表达式的文本可以在表达式或其他程序中作进一步的处理。默认情况下,每一个分组都有一个组号,从左向右,第一个出现的分组的组号为1,第二个为2,以此类推。

​ 后向引用用于重负搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本

​ 使用小括号,还有很多特定用途的语法。下面列出了最常用的一些:

分类代码说明
捕获(exp)匹配exp,并捕获文本到自动命名的组里
(?exp)匹配exp,并捕获文本到名称为name的组里
(?:exp)匹配exp,不捕获匹配的文本,也不给此分组命名
零宽断言(?=exp)匹配exp前面的位置
(?<=exp)匹配exp后面的位置
(?!exp)匹配后面跟的不是exp的位置
(?<!exp)匹配前面不是exp的位置
注释(?#comment)这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人理解
1.9 零宽断言

​ 零宽断言即向前匹配和向后匹配。

2. Java正则表达式

2.1. 简介

java使用正则表达式主要使用java.util.regex类,该类包含三个子类:

  • Pattern类:

Pattern类用于创建一个正则表达式,也可以说是创建一个匹配模式。Pattern类没有公共构造方法,要创建一个Pattern,得首先调用其公共静态编译方法,即通过 Pattern.complie(String regex) 简单工厂方法创建一个正则表达式。

指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式来创建Matcher类。

因此,典型的调用顺序是:

Pattern p = Pattern.comile(String regex);
Macher m = p.matcher(String s);
boolean b = m.matches();

在仅使用一次正则表达式时,可以方便地通过此类定义的matches方法。

boolean b = Pattern.matches(String regex, String s);
  • Matcher类:

Matcher类的构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例。

创建匹配器后,可以试用它执行三种不同的匹配操作:

  1. matches方法尝试将整个输入序列与该模式匹配。
  2. lookingAt尝试将输入序列从头开始与该模式匹配。
  3. find方法扫描输入序列以查找与该模式匹配的下一个子序列。
  • PatternSyntaxException类:

异常类。