文章

Java 正则表达式

2020.12.12 ・ 共 1071 字,您可能需要 3 分钟阅读

Tags: 正则表达式, Java, 学习笔记

字符串是一个非常万能的类型,它不仅仅可以进行修改,还可以向各个数据类型进行转换,用户输入的信息基本上都用字符串接收。于是在向其他数据类型转换的时候,为了保证转换的正确性,往往要进行验证处理,如果仅靠字符串本身的方法是非常麻烦的,在这种情况下,就出现了正则表达式。

正则表达式从 Perl 语言发展而来。在 JDK 1.4 之后,正则表达式被默认支持。提供java.util.regex开发包,针对String类也提出了一些修改,所以有方法直接支持正则处理。

java.util.regex有一个Pattern类,在这个类中定义了所有正则标记类。

正则表达式 匹配内容
任意字符 这个字符
\\ \
\n 换行
\t 制表符
[abc] abc任意一个
[^abc] 不是abc任意一个
[a-zA-Z] 一个任意字母,不区分大小写
[0-9] 一位数字
. 任意一个字符
\d 一个数字,等价于[0-9]
\D 不是一个数字
\s 任意一位空格,可能是空格、换行、制表符
\S 任意一位非空格
\w 字母、数字、下划线
\W 非字母、数字、下划线
^ 边界开始
$ 边界结束
正则表达式 匹配内容
表达式? 该表达式出现0或1次
表达式* 该表达式出现0或多次
表达式+ 该表达式出现1或多次
表达式{n} 表达式出现n次
表达式{n,} 表达式出现n次及以上
表达式{n,m} 表达式出现[n, m]次
正则表达式 匹配内容
表达式X表达式Y X表达式跟上Y表达式
表达式X|表达式Y 有一个满足即可
(表达式) 整体绑定
  • 将字符串进行正则判断public boolean matches(String regex)
  • 将字符串符合正则的进行替换public String replaceAll(String regex, String replacement)
  • 替换首个public String replaceFirst(String regex, String replacement)
  • 正则拆分public String[] split(String regex)
  • 拆分成 limit 个public String[] split(String regex, int limit)
public class Test {
  public static void main(String[] args) {
    String str = "nfsdj#$%#$SDafg23r@#sadg2334";
    String regex = "[^a-zA-Z0-9]*";
    System.out.println(str.replaceAll(regex, ""));
  }
}
import java.util.Arrays;

public class Test {
  public static void main(String[] args) {
    String str = "sdfsfa213sdfas2dsfa23";
    String regex = "\\d*";
    System.out.println(Arrays.toString(str.split(regex)));
  }
}
public class Test {
  public static void main(String[] args) {
    String str = "100.1";
    String regex = "\\d+\\.\\d+";
    System.out.println(str.matches(regex));
  }
}
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Test {
  public static void main(String[] args) throws ParseException {
    String str = "1939-12-22";
    String regex = "\\d{4}-\\d{2}-\\d{2}";
    if (str.matches(regex)) {
      System.out.println(new SimpleDateFormat("yyyy-MM-dd").parse(str));
    }
  }
}
import java.text.ParseException;

public class Test {
  public static void main(String[] args) throws ParseException {
    String str = "sdf@df.com";
    String regex = "[a-zA-Z0-9]\\w+@[\\w-]+\\.(cn|com|net|org)";
    System.out.println(str.matches(regex));
  }
}

这个包内定义有两个类:

import java.text.ParseException;
import java.util.Arrays;
import java.util.regex.Pattern;

public class Test {
  public static void main(String[] args) throws ParseException {
    String str = "sfsadf123dsf@!#SDF12rFSD!@";
    String regex = "[^a-zA-Z]+";
    Pattern pat = Pattern.compile(regex);
    String[] result = pat.split(str);
    System.out.println(Arrays.toString(result));
  }
}

实现了正则匹配处理类,这个类的对象实例化依靠Pattern类完成。

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

public class Test {
  public static void main(String[] args) throws ParseException {
    String str = "101";
    String regex = "\\d+";
    Pattern pat = Pattern.compile(regex);
    Matcher mat = pat.matcher(str);
    System.out.println(mat.matches());
  }
}

如果纯粹的拆分、替换、匹配没有必要使用这个包,但是有一种分组的功能是其他方法不具备的:分组。

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

public class Test {
  public static void main(String[] args) throws ParseException {
    String str = "sdfasdfadsfdas (#{asdf}, #{sdaf},#{sdf})";
    String regex = "#\\{\\w+\\}"; // 匹配 #{} 里的内容
    Pattern pat = Pattern.compile(regex);
    Matcher mat = pat.matcher(str);
    while (mat.find()) {
      System.out.println(mat.group());
    }
  }
}