每种语言对正则表达式有不同的使用方式,不管是匹配还是替换,不管哪种语言正则表达式的写法都是一样的。
一、正则表示的基础语法
正则表达式使用时,会将一个字符串和一个固定的模式进行匹配,这个模式就是正则表达式。
正则表达式可以是一个固定的字符串,如:“abcd”,这样的表达式,就会依次匹配a、b、c、d,按照不同的匹配模式,会进行全部匹配或在字符串中查找子串。
但是,一般正则表达式回去匹配一个固定模式的一类字符串,如邮箱,这需要一些特殊语法。
1、[]字符集合
字符集合是一些字符的集合,可以同&&[],来创造集合和集合的交集。
需要注意的是,一个[]集合在正则表达式中只代表一个字符的匹配,匹配多字符需要数量的修饰符。
[abc] 只有abc 3个字符的集合
[a-z] 有a到z 26个字符的集合
[^a-z] 除了a到z的其他所有字符的集合,^符号写在[]里是补集的意思,但它另有其他含义。
[a-z&&[^a-c]] 除了abc外的其他所有小写的字母
[a-zA-Z0-9@!#] 小写所有字母,大写所有字母,所有数字,加上@!#的字符的集合。
2、预定义字符集
一些规定好的字符集,相当于一个[]
. 任意一个字符
\d 任意一个数字,相当于[0-9]
\w 任意一个单词字符,相当于[a-zA-Z0-9]
\s 任意一个空白字符,如:空格、换行、转义等,相当于[\t\n\x0B\f\r]
\D 非数字
\W 非单词字符
\S 非空白字符
3、数量词
数量词跟在正则表达式的某个字符或集合、分组之后,表示该单位匹配的数量,如:a*,匹配0到任意多个字符。
a? 表示0个或1个a
a* 表示0个或任意多个a
a+ 表示1个到任意多个a
a{n} 表示n个a
a{n,} 表示n到任意多个a
a{n,m} 表示n到m个a
用法: a?
[agc]? \d?
(/d[agc])?
4、分组()
()表示将一段正则表达式看出一个整体,()内可以使用|表示或。
分组意义在意,将几个字符组成一个整体,可以对他进行数量词修饰。
例(one|two)? 表示连续的one或two,存在一次或不存在。
5、^和$符号
如:^a\\d{3}b$
该正则表达式表示匹配,以a开头,后有三个数字,并以b结尾的字符串。
需要注意的是,^$是用在匹配上的,使用之后匹配的整个字符串,而非子串。替换和拆分的语法不使用该字符。
个人觉得在java的函数中使用效果不是很好,暂时没有找到必须使用的案例。
6、关于字符转义的注意事项。
当不涉及编程语言,只考虑正则表达式内的转义时。当需要使用那些已经被正则表达式使用并赋予特殊含义的字符原本的含义时,需要使用转义符。
如:需要匹配?时,正则表达式应该:\?
\的正则应是:\\
大致有这些:
\ \\
? \?
* \*
+ \+
. \.
() \(\)
[] \[\]
{} \{\}
^ \^
$ \$
关于:&&字符写在[]外,没有任何影响,写在[]里面时,只能单个&使用,&&使用时是做交集的操作。&&后为空,对集合无影响。
在java中的转义:
将在正则中的所有使用的\转义成\\
如[\d]+ 转义成:[\\d]+
\\ 转义成:\\\\
二、正则表达式在不同语言中的使用
1、在java中的使用。
使用String类型自带的函数:
matches()方法:对整个字符串进行匹配,符合匹配返回true,不符合返回false。
String str = "abc123!@#"; String regex1 = "[\\w!@#]+"; String regex2 = "[\\w]+"; System.out.println(str.matches(regex1)); //true System.out.println(str.matches(regex2)); //false
split(),拆分方法,返回一个字符串的数组。
String str = "www.baidu.com"; String regex1 = "\\."; String[] splitStrs = str.split(regex1); System.out.println(Arrays.toString(splitStrs)); //[www, baidu, com]
replaceAll(),把字符串中所有满足表达式的子串替换掉。
String str = "abc123abc456abc"; String regex1 = "abc"; String replaceAll = str.replaceAll(regex1,"***"); System.out.println(replaceAll); //***123***456***
还有一个replaceFirst(),同样的用法,只是只替换第一个子串。
使用Pattern的相关类:
关于匹配的方法:三个方法都返回boolean值。
matches() 匹配整个字符串
find() 查找是否有子串
lookingAt() 从第一字符匹配子串
Pattern pattern = Pattern.compile("[\\d]{3}");//使用正则表达式创建Pattern
Matcher matcher = pattern.matcher("abc123dgh");//创建给的字符串的匹配器
boolean result1 = matcher.matches();//false
boolean result2 = matcher.find();//true
boolean result3 = matcher.lookingAt();//false