一、概述
是一个用来匹配或者描述其他内容是否满足一些语法规则的特殊字符串。说的简单点就是一种规则,有自己特殊用法。
二、正则表达式的组成
规则都在java.util.regex.Pattern 类中
常见组成规则
字符:
x字符 表示x 本身
\ 表示反斜线字符
\n 换行
\r 回车
字符类:
[abc] a b c
[^abc] 非a b c
[a-z]
[A-Z]
[a-zA-Z]
[0-9]
预定义字符类:
. 可以匹配任意字符 , \ . 匹配点本身
\d 表示 [0-9]
\D 不是0-9
\w 单词字符[a-zA-Z0-9_]
\W 非单词字符
边界匹配器:
^: 开头
$:结尾
\b 单词边界:不是单词字符的地方
slkdfj lksjdf*slkdjf,lskjdf。
数量词:
x? 一次或者0次
[1-9]?
x* 0次或多次
x+ 1次或多次
x{n} 必须n次
x{n,} 至少n次
x{n,m} n到m次
三、应用
判断
boolean matches(String regex)
告诉这个字符串是否匹配给定的 regular expression 。
import java.util.Scanner;
/**
* 验证手机号码
* 先分析规律
* 根据规律编写规则字符串
* 调用方法验证即可
*
* 第一位 1
* 第二位没有 0 1 2 6
* 从第三位开始 随意
* 一共11位
* 必须都是数字
*
* 1[345789][0-9]{9}
* */
public class demo2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入手机号");
String s = scanner.nextLine();
System.out.println(isPhone(s));
}
public static boolean isPhone(String s) {
return s.matches("1[345789][0-9]{9}");
}
}
分割
String[] split(String regex)
将此字符串分割为给定的 regular expression的匹配。
import java.util.Arrays;
public class demo5 {
public static void main(String[] args) {
String s = "99 21 55 88 11 6";
//实现最终结果 “6 11 21 55 88 99”
String[] ss = s.split(" ");
int[] arr = new int[ss.length];
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.parseInt(ss[i]);
}
Arrays.sort(arr);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]).append(" ");
}
String s1 = sb.toString();
s1 = s1.trim();
System.out.println(s1);
}
}
替换
String replaceAll(String regex, String replacement)
用给定的替换替换与给定的 regular expression匹配的此字符串的每个子字符串。
String replaceFirst(String regex, String replacement)
用给定的替换替换与给定的 regular expression匹配的此字符串的第一个子字符串。
public class demo7 {
public static void main(String[] args) {
String s = "不怕神一样的对手,就怕猪一样的队友,你个sb";
String ss = s.replaceAll("[a-zA-Z]", "*");
System.out.println(ss);
String s1 = "sldfjkjk234lskjfdl2334laskfh2344lksd4323l4j9";
String ss1 = s1.replaceAll("[0-9]", "*");
System.out.println(ss1);
String ss2 = s1.replaceAll("[0-9]+", "*");
System.out.println(ss2);
String ss3 = s1.replaceAll("[0-9]+", "");
System.out.println(ss3);
String ss4 = s1.replaceFirst("[0-9]+", "");
System.out.println(ss4);
}
}
获取
结合Pattern和Matcher类使用才能进行获取
(1)Pattern
正则表达式的编译表示。
static Pattern compile(String regex)
将给定的正则表达式编译为模式。
Matcher matcher(CharSequence input)
创建一个匹配器,匹配给定的输入与此模式。
(2)Matcher
通过模式对象Pattern 获取的匹配器对象
主要使用的获取功能:
boolean find()
尝试找到匹配模式的输入序列的下一个子序列。
String group()
返回与上一个匹配匹配的输入子序列。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class demo8 {
public static void main(String[] args) {
//等价于判断功能
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaab");
boolean matches = m.matches();
System.out.println(matches);
//获取下面字符串中由3个单词字符组成的单词
String s = "momo shi ge da shuai ge,fei chang shuai,shuai dao diao zha tian";
Pattern p1 = Pattern.compile("\\b\\w{3}\\b");
Matcher matcher = p1.matcher(s);
/*
* java.lang.IllegalStateException: No match found
* 注意:不能直接调用获取功能,获取之前先要判断
* 每次获取之前都要重新判断
* */
while(matcher.find()){
String s1 = matcher.group();
System.out.println(s1);
}
}
}