Java 正则表达式

概念

正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在不少文本编辑器里,正则表达式一般被用来检索、替换那些匹配某个模式的文本。html

相关类

java.util.regex 包主要包括如下三个类:java

  • Pattern 类: pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要建立一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式做为它的第一个参数。正则表达式

  • Matcher 类: Matcher 对象是对输入字符串进行解释和匹配操做的引擎。与Pattern 类同样,Matcher 也没有公共构造方法。你须要调用 Pattern 对象的 matcher 方法来得到一个 Matcher 对象。express

  • PatternSyntaxException: PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。编辑器

案例解析

HelloWorld

String expression = "HelloWorld";

// 建立 Pattern 对象
Pattern pattern = Pattern.compile(expression);

// 如今建立 Matcher 对象
Matcher matcher = pattern.matcher("HelloWorld");

if (matcher.matches()) {
    System.out.println("匹配");
} else {
    System.out.println("不匹配");
}

咱们以 HelloWorld 字符串做为正则表达式参数建立了一个 Pattern 对象,接着传入一个须要匹配的字符串(这里为 HelloWorld ),建立了 Matcher 对象,程序的最后打印结果为:url

成功

表明正则匹配成功。code

匹配 url

好比有url以下regexp

http://www.abc.com/1.html
http://www.abc.com/2.html

若是使用以下正则表达式:htm

String expression = "http://www.abc.com/1.html";

就只能匹配 http://www.abc.com/1.htmlhttp://www.abc.com/2.html 匹配不了。对象

修改成以下:

String expression = "http://www.abc.com/\\d+\\.html"

两个都能匹配了。

String expression = "http://www.abc.com/\\d+\\.html"

// 建立 Pattern 对象
Pattern pattern = Pattern.compile(expression);

// 如今建立 Matcher 对象
Matcher matcher = pattern.matcher("http://www.abc.com/1.html");

if (matcher.matches()) {
    System.out.println("匹配");
} else {
    System.out.println("不匹配");
}

注意上面 expression 中的 \\d+,这个表明正则表达式模式语法。这也是不少人以为正则表达式是噩梦的缘由,可能以为该模式语法很奇怪。

好比 \\d+ 是由两个语法组成的:

  • \d:数字字符匹配。等效于 [0-9]。
  • +:一次或屡次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。

组合起来能够解释为,匹配一个或者多个数字,好比:1,2,222,4344,都能匹配成功。

因此使用 String expression = "http://www.abc.com/\\d+\\.html" 来匹配 http://www.abc.com/1.html 是能够成功的。

还有一个 \\. 也须要解释一下,由于点号 . 在正则表达式语法里面有特殊意义,须要转义一下,因此 \\. 表明匹配点号 .

String expression = "." 能够匹配除"\r\n"以外的任何单个字符,好比:abc。若是想匹配点号 .,能够写 String expression = "\\.",这样就只能匹配单个点号 . 了。

两个斜线的问题

在其余语言中,\\ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。

在 Java 中,\\ 表示:我要插入一个正则表达式的反斜线,因此其后的字符具备特殊的意义。

因此,在其余的语言中,一个反斜杠 \ 就足以具备转义的做用,而在正则表达式中则须要有两个反斜杠才能被解析为其余语言中的转义做用。也能够简单的理解在正则表达式中,两个 \ 表明其余语言中的一个 \,这也就是为何表示一位数字的正则表达式是 \\d,而表示一个普通的反斜杠是 \\\\

正则表达式语法

参考这里

匹配和操做分组

在每种模式中,经过将模式的各部分放在圆括号中来建立分组。分组从左向右编号,从 1 开始编号(分组 0 表示完整的匹配结果,表明整个表达式)。

好比上面匹配 url 的正则表达式,String expression = "http://www.abc.com/\\d+\\.html" 来匹配 http://www.abc.com/1.htmlhttp://www.abc.com/2.html,想要得到那个匹配的数字 1 和 2,能够修改以下:

String expression = "http://www.abc.com/(\\d+)\\.html";

// 建立 Pattern 对象
Pattern pattern = Pattern.compile(expression);

// 如今建立 Matcher 对象
Matcher matcher = pattern.matcher("http://www.abc.com/1.html");

if (matcher.matches()) {
    System.out.println("匹配");
    System.out.println("group0:" + matcher.group());
    System.out.println("group1:" + matcher.group(1));
} else {
    System.out.println("不匹配");
}

结果以下:

匹配
group0:http://www.abc.com/1.html
group1:1

能够看到,咱们获取到了那个匹配的数字。

咱们在原来 \\d+ 的基础上,加了一对括号 (\\d+),由于 String expression = "http://www.abc.com/(\\d+)\\.html" 里面只有一对括号,因此 (\\d+) 这部分表明第一组。

再来一个稍微复杂点儿的,好比想得到 3室1厅2卫 中的 3,1,2,能够以下作

String expression = "(\\d)\\D(\\d)\\D(\\d)\\D";

// 建立 Pattern 对象
Pattern pattern = Pattern.compile(expression);

// 如今建立 Matcher 对象
Matcher matcher = pattern.matcher("3室1厅2卫");

if (matcher.matches()) {
    System.out.println("匹配");
    System.out.println("group0:" + matcher.group());
    System.out.println("group1:" + matcher.group(1));
    System.out.println("group2:" + matcher.group(2));
    System.out.println("group3:" + matcher.group(3));
} else {
    System.out.println("不匹配");
}

结果以下:

匹配
group0:3室1厅2卫
group1:3
group2:1
group3:2

String expression = "(\\d)\\D(\\d)\\D(\\d)\\D" 解释以下,从左往右读:

  • 第1个字符匹配一个数字,并且为第1组
  • 第2个字符匹配一个非数字
  • 第3个字符匹配一个数字,并且为第2组
  • 第4个字符匹配一个非数字
  • 第5个字符匹配一个数字,并且为第3组
  • 第6个字符匹配一个非数字

参考资料

相关文章
相关标签/搜索