一、java中正则表达式常用的语法
字符的取值范围
1.[abc] : 表示可能是a,可能是b,也可能是c。
2.[^abc]: 表示不是a,b,c中的任意一个
3.[a-zA-Z]: 表示是英文字母
4.[0-9]:表示是数字
简洁的字符表示
.:匹配任意的字符
\d:表示数字
\D:表示非数字
\s:表示由空字符组成,[ \t\n\r\x\f]
\S:表示由非空字符组成,[^\s]
\w:表示字母、数字、下划线,[a-zA-Z0-9_]
\W:表示不是由字母、数字、下划线组成
数量表达式
1.?: 表示出现0次或1次
2.+: 表示出现1次或多次
3.*: 表示出现0次、1次或多次
4.{n}:表示出现n次
5.{n,m}:表示出现n~m次
6.{n,}:表示出现n次或n次以上
逻辑表达式
1.XY: 表示X后面跟着Y,这里X和Y分别是正则表达式的一部分
2.X|Y:表示X或Y,比如"food|f"匹配的是foo(d或f),而"(food)|f"匹配的是food或f
3.(X):子表达式,将X看做是一个整体
二、几个简单的正则式示范
1. 表达式t.o 可以匹配:tno,t#o,teo等等。不可以匹配:tnno,to,Tno,t正o等。
2. 表达式:t[abcd]n 只可以匹配:tan,tbn,tcn,tdn。不可以匹配:thn,tabn,tn等。
3. 表达式:t(a|b|c|dd)n 只可以匹配:tan,tbn,tcn,tddn。不可以匹配taan,tn,tabcn等。
4. 表达式:[0—9]{3}\—[0-9]{2}\—[0-9]{3} 的匹配格式为:999—99—999
5. 常用正则表达式
规则 |
正则表达式语法 |
一个或多个汉字 |
^[\u0391-\uFFE5]+$ |
邮政编码 |
^[1-9]\d{5}$ |
QQ号码 |
^[1-9]\d{4,10}$ |
邮箱 |
^[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\.){1,3}[a-zA-z\-]{1,}$ |
用户名(字母开头 + 数字/字母/下划线) |
^[A-Za-z][A-Za-z1-9_-]+$ |
手机号码 |
^1[3|4|5|8][0-9]\d{8}$ |
URL |
^((http|https)://)?([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ |
18位身份证号 |
^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3})(\d|X|x)?$ |
三、由String类已经实现的几个常用方法
import java.util.Scanner;
public class MyDemo {
public static void main(String[] args){
// 1. 判断功能
Scanner sc = new Scanner(System.in);
System.out.println("请输入手机号码:");
String s1 = sc.nextLine();
String regex1 = "1[38]\\d{9}"; // 规则:13或18打头,后面再接9位数字
boolean flag = s1.matches(regex1);
System.out.println("手机号正确?" + flag);
// 2. 分割功能
String age = "18-24";
String regex2 = "-";
String[] strArr = age.split(regex2); // 分割成字符串数组
// 取得想要的值
int startAge = Integer.parseInt(strArr[0]);
int endAge = Integer.parseInt(strArr[1]);
// 3. 替换功能
String s3 = "this is my test 1984 hahaha";
String regex3 = "\\d";
String temp = "_";
String result = s3.replaceAll(regex3, temp);
System.out.println(result);
}
}
四、利用Pattern/Matcher处理的示范
import java.util.regex.*;
public class MyDemo {
public static void main(String[] args) {
// 1. 检查邮箱格式是否正确
String str = "somebody@mysite.net";
String regEx = "[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\\.){1,3}[a-zA-z\\-]{1,}";
Pattern pattern = Pattern.compile(regEx);
// Pattern pattern = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
boolean result = matcher.matches();
System.out.println(result);
// 2. 从字符串中提取出所有数字,并打印起始与结束位置
str = "我的QQ是:56789 我的电话是:12345 我的邮箱是:test9876@163.com";
regEx = "\\d+";
pattern = Pattern.compile(regEx);
matcher = pattern.matcher(str);
while(matcher.find()) {
System.out.println(matcher.group());
System.out.print("start:" + matcher.start());
System.out.println(" end:" + matcher.end());
}
// 3. 利用String类的方法,将上述字符串拆分(去除所有数字)
String[] myStrArray = str.split(regEx);
for (String s: myStrArray) {
System.out.println(s);
}
}
}
输出如下:
%JAVA_HOME%\bin\java "MyDemo" ...
true
56789
start:6 end:11
12345
start:18 end:23
9876
start:34 end:38
163
start:39 end:42
我的QQ是:
我的电话是:
我的邮箱是:test
@
.com
本文参考:
https://www.cnblogs.com/xhj123/p/6032683.html
https://blog.csdn.net/weixin_43860260/article/details/91417485
https://www.cnblogs.com/xyou/p/7427779.html
https://www.cnblogs.com/lzq198754/p/5780340.html