参考文档:
Java正则表达式正则表达式

常用正则表达式

基本语法解释

+号前的字符至少出现一次(1-n)
*号前的字符可以出现任意多次(0-n)
?号前的字符最多出现一次(0/1)

^匹配开头,$匹配结尾
\b 匹配一个单词边界,即字与空格间的位置。
\B 非单词边界匹配。
\d数字字符匹配。等效于 [0-9]。
\D非数字字符匹配。等效于 [^0-9]。
\s匹配空格符

{n}确定匹配n次
{n,}至少匹配n次0{2,}
{n,m}至少匹配n次,最多匹配m次

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

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

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

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

应用实例讲解

  • ^\d+(.\d+)?
    ^ 定义了以什么开始
    \d+ 匹配一个或多个数字
    ? 设置括号内的选项是可选的
    . 匹配 “.”
    可以匹配的实例:“5”, “1.5” 和 “2.21”。

实例:

import java.util.regex.*;
 
class RegexExample1{
   public static void main(String args[]){
      String content = "I am noob " +
        "from runoob.com.";
 
      String pattern = ".*runoob.*";
 
      boolean isMatch = Pattern.matches(pattern, content);
      System.out.println("字符串中是否包含了 'runoob' 子字符串? " + isMatch);
   }
}

实例输出结果为:
字符串中是否包含了 ‘runoob’ 子字符串? true

实例
下面的例子说明如何从一个给定的字符串中找到数字串:

RegexMatches.java 文件代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class RegexMatches
{
    public static void main( String args[] ){
 
      // 按指定模式在字符串查找
      String line = "This order was placed for QT3000! OK?";
      String pattern = "(\\D*)(\\d+)(.*)";
 
      // 创建 Pattern 对象
      Pattern r = Pattern.compile(pattern);
 
      // 现在创建 matcher 对象
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );
         System.out.println("Found value: " + m.group(3) ); 
      } else {
         System.out.println("NO MATCH");
      }
   }
}

以上实例编译运行结果如下:
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT
Found value: 3000
Found value: ! OK?

Matcher的方法介绍

  • matches 和 lookingAt 方法

matches 和 lookingAt 方法都用来尝试匹配一个输入序列模式。它们的不同是 matches 要求整个序列都匹配,而lookingAt 不要求。
lookingAt 方法虽然不需要整句都匹配,但是需要从第一个字符开始匹配

  • replaceFirst 和 replaceAll 方法

replaceFirst 和 replaceAll 方法用来替换匹配正则表达式的文本。不同的是,replaceFirst 替换首次匹配,replaceAll 替换所有匹配。

  • appendReplacement 和 appendTail 方法

Matcher 类也提供了appendReplacement 和 appendTail 方法用于文本替换:
public Matcher appendReplacement(StringBuffer sb, String replacement) 实现非终端添加和替换步骤。
public StringBuffer appendTail(StringBuffer sb)
实现终端添加和替换步骤。