正则表达式

正则表达式(英语:Regular Expression,在代码中常简写为regex)
正则表达式是一个字符串
java.util.regex包中Pattern

在正则中字母区分大小写

字符:\n
含义:换行符
例如:匹配规则为"\n",那么对应的效果就是换行,光标在原有位置的下一行

字符:\r
含义:回车符
例如:匹配规则为"\r" ,那么对应的效果就是回车后的效果,光标来到下一行行首

字符:\
含义:代表的是反斜线字符’’
例如:匹配规则为"\" ,那么需要匹配的字符串内容就是 ”\”

字符类:[abc]
含义:代表的是字符a、b 或 c
例如:匹配规则为"[abc]" ,那么需要匹配的内容就是字符a,或者字符b,或字符c的一个

字符类:[^abc]
含义:代表的是除了 a、b 或 c以外的任何字符
例如:匹配规则为"[^abc]",那么需要匹配的内容就是不是字符a,或者不是字符b,或不是字符c的任意一个字符

字符类:[0-9]
含义:代表的是 0到9数字,两头的数字包括在内
例如:匹配规则为"[0-9]",那么需要匹配的是一个数字

预定义字符类:\d
含义:代表的是 0到9数字,两头的数字包括在内,相当于[0-9]
例如:匹配规则为"\d ",那么需要匹配的是一个数字

字符类:[a-zA-Z_0-9]
含义:代表的字母或者数字或者下划线(即单词字符)
例如:匹配规则为" [a-zA-Z_0-9] ",那么需要匹配的是一个字母或者是一个数字或一个下滑线

预定义字符类:\w
含义:代表的字母或者数字或者下划线(即单词字符),相当于[a-zA-Z_0-9]
例如:匹配规则为"\w ",,那么需要匹配的是一个字母或者是一个数字或一个下滑线

字符类:[a-zA-Z]
含义:代表的是a 到 z 或 A 到 Z,两头的字母包括在内
例如:匹配规则为"[a-zA-Z]",那么需要匹配的是一个大写或者小写字母

预定义字符类:.
含义:代表的是任何字符
例如:匹配规则为" . “,那么需要匹配的是一个任意字符。如果,就想使用 . 的话,使用匹配规则”\."来实现

边界匹配器:^
含义:代表的是行的开头
例如:匹配规则为^ [abc][0-9]$ ,那么需要匹配的内容从[abc]这个位置开始, 相当于左双引号

边界匹配器: ** $ **
含义:代表的是行的结尾
例如:匹配规则为^ [abc][0-9]$ ,那么需要匹配的内容以[0-9]这个结束, 相当于右双引号

数量词:X?
含义:代表的是X出现一次或一次也没有
例如:匹配规则为"a?",那么需要匹配的内容是一个字符a,或者一个a都没有

数量词:X*
含义:代表的是X出现零次或多次
例如:匹配规则为"a*" ,那么需要匹配的内容是多个字符a,或者一个a都没有

数量词:X+
含义:代表的是X出现一次或多次
例如:匹配规则为"a+",那么需要匹配的内容是多个字符a,或者一个a

数量词:X{n}
含义:代表的是X出现恰好 n 次
例如:匹配规则为"a{5}",那么需要匹配的内容是5个字符a

数量词:X{n,}
含义:代表的是X出现至少 n 次
例如:匹配规则为"a{5, }",那么需要匹配的内容是最少有5个字符a

数量词:X{n,m}
含义:代表的是X出现至少 n 次,但是不超过 m 次
例如:匹配规则为"a{5,8}",那么需要匹配的内容是有5个字符a 到 8个字符a之间

字符串类中涉及正则表达式的常用方法
在这里插入图片描述
matches()方法

public class regexdemo {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str1 = "12345678901";
		System.out.println(str1.matches("1[^34578][0-9]{9}"));
	}
}

split方法

public class regexdemo {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str1 = "123.4567.8901";
		String[] str = str1.split("\\.");
		for(String st:str)
		{
			System.out.println(st);
		}
	}
}

replaceAll()方法

public class regexdemo {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str1 = "12a3a.4a5d6a.8f90a1";
		String a = str1.replaceAll("[a-zA-Z]\\.","***");
		System.out.println(a);//12a3***4a5d6***8f90a1
	}
}
  • 字符串中的trim()方法
    作用:消除该字符串的前后空格,并将字符串返回。并不改变原来的字符串。
    练习QQ号匹配规则
    开头不是0,其余位为数字,总共5-10位

注意:"\d"规则代表匹配数字,但是若在但是\把d给转义了
所以\d就不是"\d"的意思了,所以用\d来将\转义为普通的\

public class regexdemo {
	public static void main(String[] args) {
		String regex = "[^0][\\d]{4,9}";
		//\d加不加[]都行
		//String regex = "[^0]\\d{4,9}";
		String str1 = "124374";
		System.out.println(str1.matches(regex));
	}
}

练习根据多空格切割

public class regexdemo {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String regex = " +";
		String str1 = "130 39   66      29  43";
		String[] str = str1.split(regex);
		for(String s:str)
		{
			System.out.println(s);
		}
	}
}

练习将数字替换为星

注意:[ ]代表一个位
所以[0-9+]和[0-9]是一个道理

public class regexdemo {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String regex = "[0-9]+";
		String str1 = "abc12dasdjskadh4848";
		System.out.println(str1.replaceAll(regex, "***"));
	}
}

数字匹配
匹配正整数:”\d+”
匹配正小数:”\d+\.\d+”
匹配负整数:”-\d+”
匹配负小数:”-\d+\.\d+”
匹配保留两位小数的正数:”\d+\.\d{2}”
匹配保留1-3位小数的正数:”\d+\.\d{1,3}”

练习邮箱地址是否合法
注意()的用法,这里我将.cn括起来了 让其出现1次或0次

public class regexdemo {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String regex = "[\\w]+@[a-z0-9]+\\.[a-z]+(\\.cn)*";
		String str1 = "279693912@qq.com";
		System.out.println(str1.matches(regex));
	}
}
解释一下正则表达式含义(为什么是双斜杠,这是java正则表达式需要有两个反斜杠才能被解析为其他语言中的转义作用。)
^[\\+\\-]?\\d+

^ 表示匹配字符串开头,我们匹配的就是 '+'  '-'[] 表示匹配包含的任一字符,比如[0-9]就是匹配数字字符 0 - 9 中的一个

? 表示前面一个字符出现零次或者一次,这里用 ? 是因为 '+' 号可以省略

 \\d 表示一个数字 0 - 9 范围

+ 表示前面一个字符出现一次或者多次,\\d+ 合一起就能匹配一连串数字了

Pattern类和Matcher类M
Matcher有start和end方法来确定匹配的下标。(左闭右开)

class Solution {
    public int myAtoi(String str) {
        //清空字符串开头和末尾空格(这是trim方法功能,事实上我们只需清空开头空格)
        str = str.trim();
        //java正则表达式
        Pattern p = Pattern.compile("^[\\+\\-]?\\d+");
        Matcher m = p.matcher(str);
        int value = 0;
        //判断是否能匹配
        if (m.find()){
            //字符串转整数,溢出
            try {
                value = Integer.parseInt(str.substring(m.start(), m.end()));
            } catch (Exception e){
                //由于有的字符串"42"没有正号,所以我们判断'-'
                value = str.charAt(0) == '-' ? Integer.MIN_VALUE: Integer.MAX_VALUE;
            }
        }
        return value;
    }
}
/*
    1:^ 开始
    2:$ 结束
    3:[] 这里面的东西是可选的
    4:\\ 两个反斜杠代表转义字符
    5:? 前面一个字符出现一次或者0次
    6:\\d 和[0-9]一个意思
    7:+ 前面一个字符出现一次或者多次
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值