Java正则表达式-模式匹配器

1 模式匹配器简介

java.util.regex包里面包含三个类,以支持正则表达式的完整版本。

  • Pattern
  • Matcher
  • PatternSyntaxException

Pattern:保存正则表达式的编译形式。

Matcher:将要与模式匹配的字符串关联起来,并执行实际匹配。

PatternSyntaxException:代表格式错误的正则表达式中的错误。

2 编译正则表达式

Pattern类没有公开的构造方法,意味不能直接构造并使用。

Pattern类包含一个静态compile()方法,该方法返回一个Pattern对象。

compile()方法存在两个重载的方法。

static Pattern  compile(String regex)
static Pattern compile(String regex, int flags)

以下是Pattern类的代码示例:

import java.util.regex.Pattern;

//一点教程网
public class Main {
  public static void main(String[] args) {
    // Prepare a regular expression
    String regex = "[a-z]@.";

    // Compile the regular expression into a Pattern object
    Pattern p = Pattern.compile(regex);
  }
}

上面Pattern类的第二个重载方法中有个flags整数值,该值为标记值,用于修改Pattern的匹配模式,下面是flags可以设置的一些常量:

Flags值 说明
Pattern.CANON_EQ 启用规范对等。
Pattern.CASE_INSENSITIVE 启用不区分大小写的匹配。
Pattern.COMMENTS 允许空格和模式注释。
忽略空格和以#开头直到行尾的嵌入注释。
Pattern.DOTALL 启用dotall模式。
默认情况下,.不匹配行终止符。设置此标志时,.匹配行终止符。
Pattern.LITERAL 启用模式的文字分析。该标志使元字符和转义序列成为普通字符。
Pattern.MULTILINE 启用多行模式。默认情况下,^与$匹配的开始和输入序列的末端。此标志使模式仅逐行或输入序列的末尾匹配。
Pattern.UNICODE_CASE 启用支持Unicode的大小写。与CASE_INSENSITIVE标志一起,可以根据Unicode标准执行不区分大小写的匹配。
Pattern.UNICODE_ CHARACTER_CLASS 启用预定义字符类和POSIX字符类的Unicode版本。设置此标志时,预定义字符类和POSIX字符类符合Unicode技术标准。
Pattern.UNIX_LINES 启用Unix行模式。设置此标志后,仅将\n字符识别为行终止符。

3 Pattern的案例

3.1 案例1

以下为编译设置CASE_INSENSTIVE和DOTALL的Flags标记的代码示例:

import java.util.regex.Pattern;

//www.yidian.com 一点教程网
public class Main {
  public static void main(String[] args) {
    String regex   = "[a-z]@.";
    Pattern p  = Pattern.compile(regex,  Pattern.CASE_INSENSITIVE|Pattern.DOTALL);
  }
}

3.2 案例2

import java.util.regex.Matcher;
import java.util.regex.Pattern;

//www.yiidian.com 一点教程网
public class Main {
  public static void main(String args[]) {
    Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);

    String candidateString = "Java. java JAVA jAVA";

    Matcher matcher = p.matcher(candidateString);

    // display the latter match
    System.out.println(candidateString);
    matcher.find(11);
    System.out.println(matcher.group());

    // display the earlier match
    System.out.println(candidateString);
    matcher.find(0);
    System.out.println(matcher.group());
  }
}

以上代码执行结果为:

Java. java JAVA jAVA
JAVA
Java. java JAVA jAVA
Java

 

一点教程,一个分享编程知识的公众号。跟着站长一起学习和进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「一点教程」,你已然超越了90%的程序员!

一点教程二维码