Java_正则表达式

最近做项目反复用到正则表达式,自己虽然知道了正则表达式的用法及语法,但是在用的过程中还总是要查一些细节的东西,为了加深自己的印象,梳理自己的知识,也为了和大家分享一下正则表达式相关内容,故写此博客。

正则表达式的概念:

正则表达式:是指一个用来匹配或者描述一系列符合某个句法规则的字符串的单个字符串。简而言之就是:正则表达式是一个字符串,但这个字符串是一种规则。也可以理解为:正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作;
下面举个校验QQ号的两个例子来体现正则表达式的作用和优势(为什么要用正则表达式):
A:用普通字符串判断实现:
	public static boolean checkQQMethod1(String str){
		boolean flag = true;
		if(str.length()>15 || str.length()<5){
			flag = false;
		}else{
			if(str.startsWith("0")){
				flag = false;
			}else{
				char[] charArray = str.toCharArray();
				for(char c:charArray){
					if(!(c>='0'&&c<'9')){
						flag = false;
						break;
					}
				}
			}
		}
		return flag;
	}
B:用正则表达式实现:
	public static boolean checkQQMethod2(String str){
		String regex = "[1-9][0-9]{4,14}";
		boolean matches = str.matches(regex);
		return matches;
	}
总结:正则表达式就是用于操作字符串的规则,其中是以一些符号来表示规则的,正则可以简化对字符串的复杂操作。

正则表达式的组成规则:

1.规则字符在java.util.regex Pattern类中。

2.常见组成规则:字符、字符类、预定义字符类、边界匹配器、数量词。

正则表达式——特殊字符汇总:

$ 匹配一行的结尾
^ 匹配一行的开头
() 标识子表达式的开始和结束位置
[] 用于确定中括号表达式的开始和结束位置
{} 用于标记前面子表达式出现的频度
* 指定前面子表达式可以出现0次或者多次
+ 指定前面子表达式可以出现1次或者多次
? 指定前面子表达式可以出现0次或者1次
. 匹配除换行符\n之外的任何字符
\ 用于转义下一个字符
| 指定两项之间任选一项

正则表达式——字符类(中括号的使用):

[aeiou]匹配方括号内任意字符;
[^aeiou]匹配除aeiou之外的任何字符;
[a-z]匹配a到z的任何小写字母;
[a-zA-Z0-9]匹配a-z,A-Z,0-9此三个范围内的任何字符;
 eg:以b或c或d开头,中间字符是a,并且以d或t结尾的字符串(写出对应的正则表达式)
答案:[bcd]a[dt]

正则表达式——逻辑运算符

&&与(并且)
|或(或者)
eg:
1.判断小写辅音字母的正则表达式:
答案:[a-z&&[^aeiou]]
2.判断首字母为h或H,后跟一个元音字母,并以d结尾的正则表达式:
答案:[h|H][aeiou]d 或者 [hH][aeiou]d

正则表达式——预定义字符类

.任何字符
\d任何数字,是[0-9]的简写形式
\D任何非数字,是[^0-9]的简写形式
\s任何空白字符。空格、制表符(\t)、换行符(\n)...
\S任何非空白字符。是[^\s]的简写形式
\w任何大写或者小写字母,或数字或下划线。是[a-zA-Z0-9_]的简写形式
\W任何非单词字符。是[^\w]的简写形式
注意:在Java中将反斜线看做转义序列的开头。因此,必须在正则表达式中将反斜线指定为:\\
eg:
1.判断是否是三位数字:
答案:“\\d\\d\\d”等同于:“[0-9][0-9][0-9]”
2.判断字符串是否已h开头,中间是任何字符,并以d结尾:
答案:"h.d"
3.判断字符串是否是“had.”:
答案:"had\\."

正则表达式——限定符

限定符位于模式中子序列的后侧,确定了子序列的重复方式:
+1次或多次
?0次或1次
*0次或多次
{n}恰好n次
{n,}至少n次
{n,m}至少n次,但不超过m次(包含m次)
eg:
1.判断手机号码:
答案:"1[358]\\d{9}"
2.判断数字(可出现或者不出现小数部分)
答案:"\\d+(\\.\\d+)?"

正则表达式——边界匹配符:

^ 行的开头
$ 行的结尾
\b 单词的边界
\B 非单词的边界
\A 输入的开头
\G 前一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符
\z 输入的结尾

正则表达式——分组

验证如下序列号:
String str = "DG8FV-B9TKY-FRT9J-6CRCC-XPQ4G";
方式一:
str.matches("[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}");
方式二:
str.matches("([A-Z0-9]{5}-){4}[A-Z0-9]{5}");
或者
str.matches("[A-Z0-9]{5}(-[A-Z0-9]{5}){4}");
相关概念:
组和捕获:捕获组可以通过从左到右计算其开括号来编号。例如,在表达式((A)(B(C)))中,存在四个这样的组:
1((A)(B(C)))
2A
3(B(C))
4(C)
组零始终代表整个表达式,以左括号(来找是第几个组。
为了提高规则的复用,用()进行封装,每一个括号都有一个编号,从1开始。
为了复用这个规则,可以通过编号来完成该规则的调用,需要对编号数字进行转义。
\\1就代表第一组规则,表示这个地方的字符和第一组规则相同。
eg:String[] strArray = str.split("(.)\\1+");

正则的功能及使用

切割功能:使用String类中的split方法。
eg:
1.切割字符串“aa,bb,cc”
答案:String[] strArray = str.split(",");
2.切割字符串"aa.bb.cc"
答案:String[] strArray = str.split("\\.");
3.切割字符串"-1 99 423"
答案:String[] strArray = str.split(" +");
替换功能:使用String类的replaceAll方法。
eg:
1.用“#”替换叠:"sdaaafghccccjkqqqqql"
答案:String str = str.replaceAll("(.)\\1+","#");
2.用上面的字符串,把多个叠词替换为一个
答案:String str = str.replaceAll("(.)\\1+","$1");
3.实际应用,有些论坛不允许发电话,qq号,银行账号等,把数字用"*"替换
答案:String str = str.replaceAll("\\d+","*");
String类与正则相关方法总结:
1.boolean matches(String regex):判断该字符串是否匹配指定的正则表达式;
2.String replaceAll(String regex,String replacement):将该字符串中所有匹配regex的子串替换成replacement;
3.String replaceFirst(String regex,String replacement):将该字符串中第一个匹配regex的子串替换成replacement;
4.String[] split(String regex):以regex为分隔符,把该字符串分割为多个子串;
重点:Pattern与Matcher相关的用法
使用方式一:
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean matches = m.matches();
使用方式二:
boolean matches = Pattern.matches("a*b", "aaaaab");
Pattern是不可变类,可供多个并发线程安全使用。
Matcher提供如下几个常用方法:
find():返回目标字符串中是否包含与Pattern匹配的子串。
group():返回上一次与Pattern匹配的子串。
start():返回上一次与Pattern匹配的子串在目标字符串中的开始位置。
end():返回上一次与Pattern匹配的子串在目标字符串中的结束位置+1。
lookingAt():返回目标字符串前面部分与Pattern是否匹配。
matches():返回整个目标字符串与Pattern是否匹配。
reset():将现有的Matcher对象应用于一个新的字符序列。
	public static void main(String[] args){
		String content = "大家好,很高兴认识大家,我的手机号是15712341234欢迎大家前来联系。我公司的手机号是13512341234,我的家庭电话是18212341234,欢迎大家惠存!";
		String	regex = "[(13)|(15)|(18)]\\d{9}";
		Matcher matcher = Pattern.compile(regex).matcher(content);
		while(matcher.find()){
			System.out.println(matcher.group());
		}
	}
输出结果为:
1571234123
1351234123
1821234123
分享到此结束,欢迎大家留言,提不足,提建议!




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值