正则表达式是一套标准,可以用于任何语言
一般用 ^正则表达式$ .表示单行匹配
但在java中是默认的,所以可以不加前后开头结尾符号。
匹配年份
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s=new Scanner(System.in);
String a=s.next();
String ex="19\\d\\d";
if(a.matches(ex)) System.out.println(1);
else System.out.println(0);
}
非零qq号;
String ex="^[1-9]\\d{6,9}$";
String a="01111111";
String b="44444444";
System.out.println(a.matches(ex));
System.out.println(b.matches(ex));
匹配时间:
public static void main(String[] args) {
// TODO Auto-generated method stub
String ex="^([0-1][0-9]|[2][0-4])\\:([0-5][0-9])$";
String a="12:26";
System.out.println(a.matches(ex));
}
一、单个符号
1、英文句点.符号:匹配单个任意字符。
(因为点代表任意一个字符,所以如果想输出点,就要转义用\.)
eg:String ex=“.*ong,.*ong\.”;
表达式t.o 可以匹配:tno,t#o,teo等等。不可以匹配:tnno,to,Tno,t正o等。
2、中括号[]:只有方括号里面指定的字符才参与匹配,也只能匹配单个字符。
[…]只能匹配其中一个字符。
eg:[a-f0-9_]{6} 6个里面的字符(a-b和0-9和下划线)
表达式:t[abcd]n 只可以匹配:tan,tbn,tcn,tdn。不可以匹配:thn,tabn,tn等。
3、| 符号。相当与“或”,可以匹配指定的字符,但是也只能选择其中一项进行匹配。
(aaa|bbb)只能匹配aaa和bbb其中一个字符串
表达式: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、符号:^ 表示否,如果用在方括号内,^表示不想匹配的字符。
表达式:[^x] 第一个字符不能是x
6、\S符号:非空字符
7、\s符号:空字符,只可以匹配一个空格、制表符、回车符、换页符,不可以匹配自己输入的多个空格。
8、\r符号:空格符,与\n、\tab相同
二、快捷符号(重点)
d与D,w与W等为对立关系
1、\d表示[0—9]
2、\D表示[^0—9]表示非数字
3、\w表示[0—9A—Z_a—z]字母,数字,下划线
4、\W表示[^0—9A—Z_a—z]
5、\s表示[\t\n\r\f]只能匹配一个空白字符,(不能是两个空格)
6、\S表示[^\t\n\r\f]
7,[+|-|*/]
8. 修饰符.:点可以匹配任意一个字符
9. 修饰符:星号可以匹配任意个字符
10.修饰符+:可以匹配至少一个字符
11,修饰符 ?:可以匹配0或一个字符
12。修饰符{n}:可以匹配n个字符
13。修饰符{n,m}:可以匹配n到m个字符
14,。修饰符{n,}:可以匹配至少n个字符
三,分组匹配
(…)进行分组,在分组后,就可以提取括号内的内容
提取时间
public static void main(String[] args) {
// TODO Auto-generated method stub
String a="12:26";
String ex="^([0-1][0-9]|[2][0-4])\\:([0-5][0-9])$";
Pattern pattern=Pattern.compile(ex);
Matcher matcher=pattern.matcher(a);
if(matcher.matches())//匹配为true
{
String whole=matcher.group(0);
String h=matcher.group(1);
String m=matcher.group(2);
System.out.println(whole);
System.out.print(h+"小时");System.out.print(m+"分钟");
}
}
四、Java 中正则表达式的应用(重点)
1、判断功能
(最常用的功能)
public boolean matches(String regex)
案例:判断录入的手机号是否为13或者18开头
package Lemon;
import java.util.Scanner;
public class RegexDm {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入手机好:");
String s = sc.nextLine();
String regex = "1[38]\\d{9}";//定义手机好规则
boolean flag = s.matches(regex);//判断功能
System.out.println("flag:"+flag);
}
}
2、分割功能
public String[] split(String regex)
案例:
package Lemon;
import java.util.Scanner;
public class RegexDm {
public static void main(String[] args){
String age = "18-24";//定义年龄范围
String regex = "-";
String[] strArr = age.split(regex);//分割成字符串数组
int startAge = Integer.parseInt(strArr[0]);
int endAge = Integer.parseInt(strArr[1]);
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的年龄:");
int a = sc.nextInt();
if (a >= startAge && a <= endAge){
System.out.println("你就是我想找的");
}else{
System.out.println("滚");
}
}
}
3、替换功能
replace和replaceAll都有替换功能:
replace:使用字符串识别进行替换
replaceAll:优先使用正则表达式进行替换
String str=t.replaceAll("(\\s\\w+){3}\\.", " qiao ben zhong.");
public class 学习 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = "12342jasfkgnas234";
//把字符串里面的数字替换成*
String regex = "\\d";
String ss = "*";
String result = s.replaceAll(regex,ss);
String result2 = s.replace(regex,ss);
System.out.println(result);//*****jasfkgnas***
System.out.println(result2);//12342jasfkgnas234
}
}
4,查找功能
StringBuffer ans=new StringBuffer();
Pattern pt=Pattern.compile("(\\(\\w*\\))");
Matcher mt=pt.matcher(s);
while(mt.find())//一个一个遍历
{
String val=map.getOrDefault(mt.group(1), "?");
// s=s.replace(mt.group(1),val);
mt.appendReplacement(ans,val);
}
mt.appendTail(ans);
五,贪婪匹配
正则表达式会默认使用贪婪匹配,尽可能多的向后匹配。
solution:使用?实现终止贪婪匹配
六,pattern,matcher提高匹配速度(同时可以提取分组)
使用pattern加快匹配,存放正则表达式
使用matcher提取分组。
反复使用一个正则表达式字符串匹配,效率较低。
把正则表达式字符串编译成Pattern对象:
String ex="^([0-1][0-9]|[2][0-4])\\:([0-5][0-9])$";
Pattern pattern=Pattern.compile(ex);
String a="12:26";
System.out.println(pattern.matcher(a).matches());
matcher其他常用类:
1,mt.appendReplacement(st1,st2);替换其中的内容,
2,mt.appendTail(ans);把mt的内容给ans
StringBuffer ans=new StringBuffer();
Pattern pt=Pattern.compile("(\\(\\w*\\))");
Matcher mt=pt.matcher(s);
while(mt.find())//一个一个遍历
{
String val=map.getOrDefault(mt.group(1), "?");
// s=s.replace(mt.group(1),val);
mt.appendReplacement(ans,val);
}
mt.appendTail(ans);
提取时间
public static void main(String[] args) {
// TODO Auto-generated method stub
String a="12:26";
String ex="^([0-1][0-9]|[2][0-4])\\:([0-5][0-9])$";
Pattern pattern=Pattern.compile(ex);
Matcher matcher=pattern.matcher(a);
if(matcher.matches())//匹配为true
{
String whole=matcher.group(0);
String h=matcher.group(1);
String m=matcher.group(2);
System.out.println(whole);
System.out.print(h+"小时");System.out.print(m+"分钟");
}
}
其他综合例题
字符串后面有几个零
public class 几个零 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String a="apple win 29000";
// String ex="^\\d+?(0*)$";
// String ex="^\\w?\\d+?(0*)$";
String ex="^[\\w\\s]+?(0*)$";
Pattern p=Pattern.compile(ex);
Matcher m=p.matcher(a);
if(m.matches())
{
String ans=m.group(1);
System.out.println(ans.length());
}
}
}
力扣1804
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Solution {
public String evaluate(String s, List<List<String>> knowledge) {
StringBuilder ans=new StringBuilder();
Map<String,String> map=new HashMap<>();
for(List<String> temp:knowledge)
{
map.put("("+temp.get(0)+")",temp.get(1));
}
// Pattern pt=Pattern.compile("\\((\\w*)\\)");
Pattern pt=Pattern.compile("(\\(\\w*\\))");
Matcher mt=pt.matcher(s);
while(mt.find())//一个一个遍历
{
String val=map.getOrDefault(mt.group(1), "?");
// s=s.replace(mt.group(1),val);
mt.appendReplacement(ans,val);
}
mt.appendTail(ans);
return ans.toString();
}
}
C++ 的正则表达式函数:
regex pat(“正则表达式”);
regex_match(str,pat) 返回true/false;
#include<bits/stdc++.h>
using namespace std;
int main(){
string ip;
regex pt("((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\.){4}");//匹配0.0.0.0.-255.255.255.255.的正则表达式
while(getline(cin, ip)){
ip += "."; //正则表达式匹配的四个点,ip地址后面再加一个
if(regex_match(ip, pt)) //匹配函数
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}