正则表达式的概念
- 正则表达式:是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。
- 正则表达式的规则:
- 字符:
- \表示反斜线
- \n表示换行
- \r回车符
- 字符类:
- [abc]表示a或b或c
- [^abc]表示出了a或b或c的其他字符
- [a-zA-Z]表示a-z和A-Z的所有字母
- [0-9]表示数字0-9
- 预定义字符类:
- . 表示任何字符,如果需要.本身,则用.表示
- \d表示数字0-9,使用时\要用\表示,所以为\d
- \w表示字母,a-z,A-Z下划线_和数字0-9
- 边界匹配器
- ^ 行的开头
- $ 行的结尾
- \b 单词边界
就是不是单词字符的地方。
举例:hello world?haha;xixi 其中? ; 空格就是单词边界
- 数量词
- x* 表示0次或0次以上
- x?表示一次或一次也没有
- x+表示出现一次或多次
- x{n}表示x出现n次
- x{n,}表示n最少出现n次
- x{n,m}表示出现的次数为n-m处
- a|b出现a或者b,使用()括起来的表示可以对里面的内容匹配多次,[]表示一次,要匹配多次需加+
- 字符:
正则表达式的使用
- 要使用正则表达式,那么我们就要调用String类下的matches方法:public boolean matches(String regex)
- 演示对手机号码就行校验:
import java.util.Scanner;
public class Test5 {
public static void main(String[] args) {
System.out.println("请输入手机号码");
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
//假设手机号码的前两位为13,15,18,19开头,后面可以为任意数字,长度为11
//书写正则表达式regex
String regex="(13|15|18|19)[0-9]{9}";//或[13|15|18|19]+[0-9]{9}
boolean matches = str.matches(regex);
System.out.println(matches);
}
}
- 演示对qq邮箱进行校验:
import java.util.Scanner;
public class Test5 {
public static void main(String[] args) {
System.out.println("请输入邮箱");
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
//6~18个字符,可使用字母、数字、下划线,需以字母开头
//书写正则表达式regex
String regex="[a-zA-Z]\\w{5,17}@(163|qq)\\.[com|cn|edu]+";
boolean matches = str.matches(regex);
System.out.println(matches);
}
}
注意:[com|cn|edu]是指com中的c或o或m以及cn中的c或n以及edu中的e或d或u,在后面添加+号或者使用()代表com或cn或edu
即[]指其中的一个
正则表达式的分割功能
- 分割功能需要调用String类中的split方法,即把与正则表达式相匹配的内容删除
- public String[] split(String regex)
- 演示去掉字符串中的=号:
import java.util.Arrays;
public class Fenge {
public static void main(String[] args) {
String str2 = "我喜欢你=稀罕你=爱死你=我喜欢你=稀罕你=爱死你";
String regex="[=]";
String[] split = str2.split(regex);
System.out.println(Arrays.toString(split));
}
}
- 去掉字符串中的数字
import java.util.Arrays;
public class Fenge {
public static void main(String[] args) {
String str="asd123sdfnsdj23sdjfnsd3424";
//书写正则表达式
String regex="[\\d]+";//如果没有写+号也可以去除,但是会留下很多的逗号,因为是一个一个分割的,加了+号可以一次性分割
String[] split = str.split(regex);
System.out.println(Arrays.toString(split));
}
}
-演示//91 27 46 38 50”,请写代码实现最终输出结果是:”27 38 46 50 91”:
import java.util.Arrays;
public class Test6 {
public static void main(String[] args) {
//91 27 46 38 50”,请写代码实现最终输出结果是:”27 38 46 50 91”
String str="91 27 46 38 50";
//书写正则表达式然后使用split将空格分割
String[] arr = str.split(" ");
//使用Arrays中的sort方法进行排序
Arrays.sort(arr);
//排序结束再给加上空格,调用StingBuffer
StringBuffer sb = new StringBuffer();
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]).append(" ");
}
//循环结束后数字间隔中加入了空格,但是数字末尾还有一个空格,调用String类的trim方法去掉空格
String s = sb.toString().trim();
System.out.println(s);
}
}
正则表达式的替换功能
- 调用String类中的replaceAll方法:public String replaceAll(String regex,String replacement)
- 演示把字符串中的数字替换为*
public class Test7 {
public static void main(String[] args) {
String str="asdas123sadnasd123asdas";
//把字符串中的数字全部替换为*
String s = str.replaceAll("\\d", "*");
System.out.println(s);
}
}
正则表达式的获取功能
- A:使用模式器Pattern中的compile方法把正则表达式封装进模式器Pattern
- B:模式器调用matcher方法声明一个匹配器Matcher
- C:调用匹配器Matcher下的find方法
- D:调用匹配器Matcher下的group方法
- 注意:find方法是寻找下一个模式匹配的序列,所以必须先使用find方法再使用group方法
- 演示获取字符串中的所有数字
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test7 {
public static void main(String[] args) {
String str="asdfsa123sdfsdf123";
Pattern pattern = Pattern.compile("\\d");//compile方法是把正则表达式编译为模式器
Matcher matcher = pattern.matcher(str);//模式器pattern创建一个匹配器matcher
while (matcher.find()){
String group = matcher.group();
System.out.print(group);
}
}
}