正则表达式浅谈

版权声明:欢迎转载,共同进步,麻烦注明转载出处 https://blog.csdn.net/Hanxiaofan95/article/details/83548260

对于字符串,最常用的就是String类,我们通过String类所提供的各种方法进行操作字符串,而且,String所提供的方法本身已经很丰富了,可以满足很多情况下的使用需求。但是总有一些情况下,使用传统的String类的方法会使得问题比较难以解决,就比如说邮箱校验,使用传统的方法会使得问题的复杂度大大增加,这个时候,就要使用一种很强的工具了,那就是正则表达式。
正则表达式可以帮助我们按照一定的模式,对我们想要操作的字符串进行匹配,就比如说我想要在一个大文本中,寻找一个满足你是XXX,你可以帮我下吗?的所有子字符串,通过正则表达式就可以很方便的实现匹配。说了这么多,下面来进入正题。
正则表达式的字符:

. 所有字符
[abc] 包含了a,或者b,或者c的任何字符
[^abc] 除了a,b,c之外的任何字符相当于非操作
[a-zA-Z] 从a到z或者A到Z的任何字符
\s 空白符
\S 非空白符,相当于[^\S]
\d 数字
\D 非数字,相当于[^\D]
\w 词字符,相当于[a-zA-Z0-9]
\W 非词字符

以上就是常用的正则表达式的字符表示。除了这些表示之外,我们还可以通过使用转义符\来使用一些其他的特殊字符,就比如说是双引号\\",<,>....,等等,都可以在正则表达式里使用,这里列举的不全,具体可以到使用的时候参考官方文档。
在这里有一点需要注意,那就是我们在java的正则表达式里,如果想要插入一个\的话,就必须使用\\\\,这就是Java正则表达式和其他语言的正则表达式不一样的地方,在其他的语言里,\\表示就是我需要在这里插入一个\,这个反斜杠没有任何意义,但是在Java里,正好相反,\\表示这是插入一个反斜杠,这个反斜杠后面的字符有特殊含义,所以,\w在Java中,因该是\\w
详细的正则表达式的编写可以等遇到具体的情况时具体看。
正则表达式中的量词用来描述正则表达式匹配的方式,有三种常用的量词,分别是*+,这三种。*表示前面的表达式匹配零次或者多次,+表示前面的表达式匹配一次或者多次,最少匹配一次,?表示前面的表达式要么匹配一次,要么匹配零次,其中?通常用来和前面两种搭配使用。除了这三种以外,还有一种指定匹配次数的方式,那就是{n},{n,m},{n,},我们可以利用这种形式来指定前面的正则表达式匹配n次,匹配次数大于等于n,小于m次,至少匹配n次。
正则表达式[]()的区别:
方括号用于单个匹配,就是说当匹配当这个位置的时候,它的值只能是方括号里的其中一个,不能是两个或者多个,举个例子,[abc]就是在该位置的字符只能是a或者是b或者是c,圆括号是组匹配,意思是当匹配到该位置的时候,从该位置开始,接下的几位都必须和圆括号里的规则相匹配,举个例子就是(abc),从该位置开始,连续三个字符必须是abc。
对于正则表达式的使用,String类为我们提供了split()方法,可以按照我们输入的正则表达式对字符串进行截取,Java为我们提供了专门的类库,regex类库,它里面有两个类,Pattern类和Matcher类。通过这两个类就可以利用正则表达式来对字符串进行各种骚操作了。

//这个方法可以按照输入的正则表达式对字符串进行匹配并且返回匹配到的最大子字符串
//该方法可以作为一个模板
private String matchString(String regex,String s) {
	Pattern p = Pattern.compile(regex);
	Matcher m = p.matcher(s);
	if(m.find()) {
		String str = m.group();
		return str;
	}
	return null;
}

上面的代码就是Pattern和Matcher类的使用模板,可以参考官方文档。至于两个类中的常用方法可以参考官方api,或者别的博客,大佬都有很多整理好的资料,这里就不再贴了,或者我后面再慢慢补充。如有错误,请多担待,后面还会持续的修改补充。
++++++++++++++++++分割线/补充内容++++++++++++++++++++++++++++++++++
对于正则表达式的三种匹配方式,最近因为写脚本的原因,发现这是一个我遗漏的重点。正则表达式的匹配,我们通常的做法是直接使用find()方法来进行判断,但是对于find()方法来说,它会在字符串的任意位置去匹配这个正则表达式,只要有一个地方符合,就会返回true,但是有些情况下,我们可能需要的是特定位置的匹配,就比如我最近脚本中需要对xml文件解析,解析节点的时候,就需要匹配整个字符串,而不是其中的某一部分,所以find()方法就不适用了,我采用了matches()方法。
下面就是三种匹配方式:

find() 可以在输入的任意位置匹配正则
matches() 匹配整个输入的字符串,只有整个字符串匹配才返回true
lookingAt() 只要输入的第一部分匹配就会返回true

这样我们就可以在实际的使用当中,根据我们的需求,选择合适的匹配方式来匹配。

猜你喜欢

转载自blog.csdn.net/Hanxiaofan95/article/details/83548260