目录
一:正则表达式应用实例
二:正则表达式三个常用的类
三:分组、捕获、反向引用
五:String类中使用正则表达式
六:正则表达式练习题
一:正则表达式应用实例
1.1 验证汉字:
public static void main(String[] args) {
//1.验证汉字
String content="周嘉兴aa教育";
String regExp="^[\u0391-\uffe5]+$";
Pattern pattern=Pattern.compile(regExp);
Matcher matcher=pattern.matcher(content);
if(matcher.find()){
System.out.println("该字符串是由汉字组成的");
}else {
System.out.println("该字符串不是由汉字组成的");
}
}
1.2 验证邮政编码:(是由(1-9)开头的6位数,比如123890)
//2.验证邮政编码
String content="123890";
String regExp="^[1-9]\d{5}$";
Pattern pattern=Pattern.compile(regExp);
Matcher matcher=pattern.matcher(content);
if(matcher.find()){
System.out.println("该字符串是由一段数字串组成的");
}else {
System.out.println("该字符串不是由一段数字串组成的");
}
1.3 验证QQ号:(是由(1-9)开头的5位至10位数)
//3.验证QQ号
String content="1238900000";
String regExp="^[1-9]\d{4,9}$";
Pattern pattern=Pattern.compile(regExp);
Matcher matcher=pattern.matcher(content);
if(matcher.find()){
System.out.println("该字符串是由QQ号组成的");
}else {
System.out.println("该字符串不是由QQ号组成的");
}
1.4 手机号码:(必须以13,14,15,18开头的11位数)
// 4.手机号码:(必须以13,14,15,18开头的11位数)
String content="13389000000";
String regExp="^1[3458]\d{9}$";
Pattern pattern=Pattern.compile(regExp);
Matcher matcher=pattern.matcher(content);
if(matcher.find()){
System.out.println("该字符串是由手机号组成的");
}else {
System.out.println("该字符串不是由手机号组成的");
}
1.5 验证URL:
//5.验证URL:(https://www.bilibili.com/video/BV1Eq4y1E79W?p=17&spm_id_from=pageDriver)
String content="https://www.bil-ibili.com/video/-BV1Eq4y1E79W?p=17&spm_id_from=pageDriver";
// String content="https://www.biblibili.com";
// String regExp="^((https|http)://)([\w-]+\.)+[\w-\?/]+$";
// String regExp="^(https|http)://(\w+\.)(.+)$"; // -----(成功)
//标准格式:(注意:[.?*]表示匹配就是.本身)
String regExp="(^((https|http)://))?([\w-]+\.)+[\w-]+(\/[\w-?=&/%.#]*)?$";
Pattern pattern=Pattern.compile(regExp);
Matcher matcher=pattern.matcher(content);
if(matcher.find()){
System.out.println("该字符串是由URL组成的");
}else {
System.out.println("该字符串不是由URL组成的");
}
二:正则表达式三个常用的类
java.util.regex包主要包括以下三个类:Pattern类、Matcher类和PatternSyntaxException类
2.1 Pattern类:
pattern对象是一个正则表达式对象。Pattern类没有公共构造方法。要创建一个Pattern对象,调用其公共静态方法,它返回一个Pattern对象。该方法接收一个正则表达式作为它的第一个参数,比如:Pattern r=Pattern.compile(pattern);
Pattern类的方法matches:(重点)
可以用 matches方法来根据我们的需求来判断字符串的类型。
2.2 Matcher类:
Matcher对象是对输入字符串进行解释和匹配的引擎。与Pattern类一样,Matcher也没有公共构造方法。你需要调用Pattern对象的matcher方法来获得一个Matcher对象
Matcher类的方法及说明:
2.3 PatternSyntaxException类:
三:分组、捕获、反向引用PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
要想解决前面的问题,我们需要了解正则表达式的几个概念:
1.分组:
我们可以用圆括号组成一个比较复杂的匹配模式,那么一个圆括号的部分我们可以看作是一个子表达式/一个分组。
2.捕获:
把正则表达式中子表达式/分组匹配的内容,保存到内存中以数字编号或显示命名的组里,方便后面使用,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推,组0代表的是整个正则式。
3.反向引用:
圆括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,这个我们称为反向引用,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部,内部反向引用\分组号,外部反向引用$分组号。
4.案例:
4.1 要匹配两个连续的相同数字:(\d)\1
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExp10 {
public static void main(String[] args) {
//1.匹配两个连续的相同数字
String content="1111";
String regStr="(\d)\1";
/*Pattern pattern=Pattern.compile(regStr);
Matcher matcher=pattern.matcher(content);
while (matcher.find()){
System.out.println(matcher.group(0));
}*/
//可以判断一个两位数的各个数字是否相同
if(Pattern.matches(regStr,content)){
System.out.println("yes");
}else {
System.out.println("no");
}
}
}
4.2 要匹配两个连续的相同数字:(\d)\1{4}
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExp10 {
public static void main(String[] args) {
//2.要匹配五个连续的相同数字
String content="11111";
String regStr="(\d)\1{4}";
/*Pattern pattern=Pattern.compile(regStr);
Matcher matcher=pattern.matcher(content);
while (matcher.find()){
System.out.println(matcher.group(0));
}*/
//可以判断一个两位数的各个数字是否相同
if(Pattern.matches(regStr,content)){
System.out.println("yes");
}else {
System.out.println("no");
}
}
}
4.3 要匹配个位与千位相同,十位与百位相同的数5225,1551:(\d)(\d)\2\1
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExp10 {
public static void main(String[] args) {
//3.要匹配个位与千位相同,十位与百位相同的数5225,1551
String content="5225";
String regStr="(\d)(\d)\2\1";
/*Pattern pattern=Pattern.compile(regStr);
Matcher matcher=pattern.matcher(content);
while (matcher.find()){
System.out.println(matcher.group(0));
}*/
//可以判断一个两位数的各个数字是否相同
if(Pattern.matches(regStr,content)){
System.out.println("yes");
}else {
System.out.println("no");
}
}
}
4.4 请在字符串中检索商品编号,形式如:12321-333999111 这样的号码,要求满足前面是一个5位数,然后一个-号,然后是一个九位数,连续的每三个要相同:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExp10 {
public static void main(String[] args) {
//.4 请在字符串中检索商品编号,形式如:12321-333999111 这样的号码,要求满足前面是一个5位数,然后一个-号,然后是一个九位数,连续的每三个要相同
String content="12321-333999111";
String regStr="^\d{5}-(\d)\1{2}(\d)\2{2}(\d)\3{2}";
/*Pattern pattern=Pattern.compile(regStr);
Matcher matcher=pattern.matcher(content);
while (matcher.find()){
System.out.println(matcher.group(0));
}*/
//可以判断一个两位数的各个数字是否相同
if(Pattern.matches(regStr,content)){
System.out.println("yes");
}else {
System.out.println("no");
}
}
}
4.5 经典的结巴程序:
package regexp;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExp10 {
public static void main(String[] args) {
//.5.将“我...我要...学学学学...编程java”通过正则表达式修改成“我要学编程java”;
//1.首先,先消去字符串中所有的.
String content="我...我要...学学学学...编程java";
String regStr="\.";
Pattern pattern=Pattern.compile(regStr);
Matcher matcher=pattern.matcher(content);
content=matcher.replaceAll("");
/*
//2.去掉所有重复的字:我我要学学学学编程java
//思路:
//(1)使用(.)\1+
//(2)使用反向引用来替换匹配到的内容
//注意:因为正则表达式变化,所以需要重置matcher
pattern=Pattern.compile("(.)\1+");
matcher=pattern.matcher(content);
while (matcher.find()){
System.out.println("找到="+matcher.group(0));
}
//使用反向引用来替换匹配到的内容
content=matcher.replaceAll("");
System.out.println("content: "+content);
*/
//使用一条语句,去掉重复的字,我我要学学学学编程java
content=Pattern.compile("(.)\1+").matcher(content).replaceAll("");
System.out.println(content);
}
}
五:String类中使用正则表达式
5.1 案例1:实现替换功能:
package regexp;
import java.util.regex.Pattern;
public class RegExp11 {
public static void main(String[] args) {
String content="JDK1.4,JDK1.5,JDK8.0";
content= Pattern.compile("JDK1\.4|JDK1\.5").matcher(content).replaceAll("JDK");
System.out.println(content);
}
}
5.2 案例2:实现判断功能:
String content="13812345678";
// if(Pattern.matches("^(138|139)\d{8}",content)){
if(content.matches("^1(38|39)\d{8}")){ //这种方法比较简洁
System.out.println("YES");
}else {
System.out.println("NO");
}
5.3 案例3:实现分割功能:
String content="wo-ai-shang-hai";
String[] str=content.split("-");
for(String s:str){
System.out.print(s+" ");
}
六:正则表达式练习题
6.1 作业一:
String content="1494972346@qq.com";
if(content.matches("(\w+|_|-)@(\w+\.*)[a-zA-Z]+$")){
System.out.println("YES");
}else {
System.out.println("NO");
}
6.2 作业二:
String content=String.valueOf(-12.00);
if(content.matches("^(-?)\d+\.([1-9]+)$")){
System.out.println("该数字不是整数");
}else {
System.out.println("该数字是整数");
}
6.3 作业三:
String content="http://www.sohu.com:8080/abc/index.htm";
String regStr="^([a-zA-Z]+)://([a-zA-Z.]+):(\d+)[\w-/]*/([\w.])+$";
Pattern pattern=Pattern.compile(regStr);
Matcher matcher=pattern.matcher(content);
while (matcher.matches()){//整体匹配,如果匹配成功,可以通过group(x),获取对应分组的内容
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));
System.out.println(matcher.group(4));
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)