📜  Java正则表达式-模式类(1)

📅  最后修改于: 2023-12-03 15:32:03.846000             🧑  作者: Mango

Java正则表达式-模式类

在Java中,正则表达式是一种处理文本的强大工具。它可以用于搜索、解析、替换字符串中的文本。Java中正则表达式由Pattern和Matcher类实现,本文主要介绍Pattern类。

Pattern类

Pattern类是正则表达式的编译后表示。可以通过调用Pattern类的静态方法compile()对正则表达式进行编译,编译后生成一个Pattern对象。例如:

Pattern pattern = Pattern.compile("\\d+"); // 匹配数字
常用方法
  • compile(String regex): 将正则表达式编译为Pattern对象。
  • matcher(CharSequence input): 创建一个Matcher对象,用于匹配输入的序列。
  • matches(String regex, CharSequence input): 判断输入的字符串是否与正则表达式匹配。
  • split(CharSequence input): 根据正则表达式将输入的字符串分割为多个字符串数组。
  • toString(): 返回此模式的字符串表示形式。

例如:

String text = "Hello 123 World!";
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
    System.out.println("数字:" + matcher.group()); // 输出:数字:123
}

上述代码示例中,Pattern.compile("\\d+")编译了匹配数字的正则表达式,matcher(text)创建了一个匹配text的Matcher对象。在while循环中,使用matcher.find()方法查找是否有匹配的字符串,若找到,使用matcher.group()方法获取匹配的字符串。

正则表达式语法

Java中正则表达式的语法主要包含以下内容:

  • 字符类:用来表示一组字符。
  • 限定符:用来限制某个表达式出现的次数。
  • 定位符:用来匹配字符串的开头或结尾。
  • 分组:可以将一个含义相同的多个字符写在一起,以便后面引用。
  • 转义字符:使用反斜杠\将特殊字符转义为普通字符。
字符类
  • []:表示字符集合,匹配方括号内列举的任意一个字符。
  • [^]:表示除了字符集合中列举的字符外的任意一个字符。
  • -:表示范围,如[a-z]表示匹配小写字母a到z之间的任意一个字符。

例如:

Pattern pattern = Pattern.compile("[a-f]");
Matcher matcher = pattern.matcher("My test message");
while (matcher.find()) {
    System.out.println(matcher.group()); // 输出:e
}

上述代码中, [a-f]匹配a到f之间的任意一个字符,My test message中有一个字符e匹配该正则表达式,因此输出e。

限定符
  • *:表示匹配0次或多次。
  • +:表示匹配1次或多次。
  • ?:表示匹配0次或1次。
  • {n}:表示匹配n次。
  • {n,}:表示至少匹配n次。
  • {n,m}:表示匹配n次到m次。

例如:

Pattern pattern = Pattern.compile("lo+");
Matcher matcher = pattern.matcher("Hello World");
while (matcher.find()) {
    System.out.println(matcher.group()); // 输出:lo
}

上述代码中,lo+表示匹配一个或多个字符l,后跟一个字符o,Hello World中有一个字符组lo满足该正则表达式。

定位符
  • ^:表示匹配开头。
  • $:表示匹配结尾。
  • \b:表示匹配单词边界。
  • \B:表示匹配非单词边界。

例如:

Pattern pattern = Pattern.compile("^Hello.*");
Matcher matcher = pattern.matcher("Hello World!");
if (matcher.find()) {
    System.out.println("Matched: " + matcher.group()); // 输出:Matched: Hello World!
}

上述代码中,^Hello.*表示字符串以Hello开头,后跟任意字符。"Hello World!"匹配该正则表达式,因此输出Matched: Hello World!。

分组

用括号把正则表达式括起来,表示一个组。可以使用()对正则表达式进行分组,以便更好地匹配。例如:

Pattern pattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher matcher = pattern.matcher("1998-05-02");
if (matcher.find()) {
    System.out.println("Year: " + matcher.group(1)); // 输出:Year: 1998
    System.out.println("Month: " + matcher.group(2)); // 输出:Month: 05
    System.out.println("Day: " + matcher.group(3)); // 输出:Day: 02
}

上述代码中,"(\\d{4})-(\\d{2})-(\\d{2})"表示匹配由一个4位数字,一个连字符,两个2位数字和一个连字符组成的字符串。"1998-05-02"与该正则表达式匹配,(\\d{4})表示第一个组匹配4位数字,(\\d{2})表示第二个组匹配连字符后的2位数字,以此类推。

转义字符

用于转义正则表达式中的特殊字符。例如,\.表示匹配点。