目录
参考链接
介绍
- 正则表达式定义了字符串的模式;
- 正则表达式可以用来搜索、编辑或处理文本;
- 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
其他的请自己百度,Java 中与正则直接关联的有三个包装类(其他的一些类也有使用到正则表达式,例如 String 类等等,我是传送门),这三个类都位于 java.util.regex 包下,说明如下:
Pattern 类: pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数;
Matcher 类: Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象;
PatternSyntaxException: PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误(这个用的较少,本篇就不分析了)。
示例代码:
import java.util.regex.*;public class RegExpClass {public static void main(String[] args) {String str = "100-99-98";Boolean ifMatch = Pattern.matches("[0-9]*-[0-9]*-[0-9]*", str); // 第一个参数是正则表达式,第二个参数是检查匹配的目标System.out.println(ifMatch);}}
捕获组
捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。先看以下代码:
import java.util.regex.*;public class RegExpClass {public static void main(String[] args) {String str = "<p id=\"text\">ABC</p>";Pattern ptn = Pattern.compile("(<p.*?>)(.*?)(</p>)"); // 算上整个匹配字符串,共4个组,".*?"是非贪婪模式,获得最短匹配Matcher mtr = ptn.matcher(str); // 创建Matcher对象if (mtr.find()) {System.out.println(mtr.group(0)); // "<p id="text">ABC</p>"System.out.println(mtr.group(1)); // "<p id="text">"System.out.println(mtr.group(2)); // "ABC"System.out.println(mtr.group(3)); // "</p>"} else {System.out.println("None");}}}
以上代码先创建了两个实例对象,首先根据正则表达式创建 Pattern 对象(使用 compile 方法),然后又根据 Pattern 对象和检查匹配的目标字符串创建 Matcher 对象(使用 matcher 方法),将正则表达式和字符串联系在一起,之后用 Matcher 对象的 find 方法检查正则匹配是否通过,如果不通过则输出”None”,否则就输出各捕获组的匹配结果(一共4个捕获组,使用 group 方法访问)。
捕获组怎么看?上例中的正则表达式为(<p.*?>)(.*?)(</p>),每个括号为依次匹配,每次匹配后剩余的字符串作为下一次匹配的目标,也就是说,第一次匹配<p.*?>之后,捕获到的结果为<p id="text">,剩余的字符串为ABC</p>,对其进行第二次匹配,正则表达式为.*?,捕获到的结果为ABC,剩余的字符串为</p>,最后由正则表达式</p>捕获。
注意:
group(0)是一个特殊的捕获组,捕获的是整个匹配字符串。- Java 中有特殊符号的转义要加两个反斜杠,例如
\d要写成\\d。
正则表达式语法

Matcher类常用方法
索引
mtr.start(): 返回匹配结果的第一个字符索引位置;mtr.end(): 返回匹配结果的最后终止位置,即最后一个字符索引位置加一。
示例代码:
import java.util.regex.*;public class RegExpClass {public static void main(String[] args) {String str = "2018-06-17 14:47 PM";String regExp = "\\d*:\\d*";Pattern ptr = Pattern.compile(regExp);Matcher mtr = ptr.matcher(str);if (mtr.find()) {System.out.println(mtr.start()); // 11System.out.println(mtr.end()); // 16} else {System.out.println("None");}}}
返回结果
mtr.find(): 目标字符串是由有正则匹配到的结果,常用于判断;mtr.lookingAt()和mtr.matches(): 正则表达式是否匹配整串目标字符串。
示例代码:
import java.util.regex.*;public class RegExpClass {public static void main(String[] args) {String str = "2018-06-17 14:47 PM";String regExp = "\\d*:\\d*";Pattern ptr = Pattern.compile(regExp);Matcher mtr = ptr.matcher(str);System.out.println(mtr.find()); // trueSystem.out.println(mtr.matches()); // falseSystem.out.println(mtr.lookingAt()); // false}}
替换
mtr.replaceFirst(rpcVal): 将匹配到的第一个字符串替换为 rpcVal;mtr.replaceAll(rpcVal): 将所有匹配到的字符串替换为 rpcVal;
示例代码:
import java.util.regex.*;public class RegExpClass {public static void main(String[] args) {String str1 = "2018-06-17 14:47 PM";String str2 = str1;String regExp = "\\d*-";Pattern ptr = Pattern.compile(regExp);Matcher mtr1 = ptr.matcher(str1);Matcher mtr2 = ptr.matcher(str2);if (mtr1.find() && mtr2.find()) {str1 = mtr1.replaceFirst("*-");str2 = mtr2.replaceAll("*-");System.out.println(str1); // "*-06-17 14:47 PM"System.out.println(str2); // "*-*-17 14:47 PM"} else {System.out.println("None");}}}
ID : 82DATE : 2018/06/17AUTHER : WJT20TAG : Java
