一、引入
什么是正则表达式呢?由于在编写程序时,经常会遇到一种情况,就是输入某个数据,pa该数据是否合法。例如我们平时在输入电话号码、邮箱又或者注册时填写昵称等等各种情况时,在我们输入数据后,系统常常会告诉我们,我们的输入是否有效。那么如何实现这个功能呢?这时就要借助正则表达式了。判断
二、概念
正则表达式(regular expression ,简写为regex)是一个字符串,用来描述匹配一个字符串集合的模式。在字符串的处理中,正则表达式是一个强大的工具。使用正则表达式可以匹配、替换和分割字符串。
三、匹配字符串
在前面的引入中,我们提到正则表达式是用来验证用户输入。在String类中有equals方法和matches方法。两种方法看上去似乎是差不多的。例如,
以上两个语句返回值都是true。
但是,matches方法比equals更加强大,equals判断两个字符串是否相等,而matches则是判断字符串是否匹配某一个模式。例如,
以上三条语句返回值都是true,这是因为“java.*”是一个正则表达式,描述了一个字符串模式,即从Java开始,后面跟着0个或多个字符串。“.*”可以匹配任何0个或多个字符。
三、正则表达式语法
正则表达式 | 匹配 | 示例 |
---|---|---|
x | 指定字符x | Java匹配[Java] |
. | 任意单个字符 | Java匹配[J..a] |
(ab|cd) | ab或者cd | ten匹配t(en|im) |
[abc] | a、b或者c | Java匹配JJa[uvwx]a |
[^abc] | 除开a、b或者c外的任意字符 | Java匹配Ja[^ars]a |
[a-z] | a到z | Java匹配[A-M]av[a-d] |
[^a-z] | 除开a到z的所有字符 | Java匹配[^b-d] |
[a-e[m-p]] | a到e或m到p | Java匹配[A-G[I-M]]av[a-d] |
[a-e&&[c-p]] | a到e和c到p的交集 | Java匹配[A-P&&[I-M]]av[a-d] |
\d | 个位数即[0-9] | Java2匹配Java[\\d] |
\D | 一位非数字 | $Java匹配[\\D][\\D]Java |
\w | 单词字符 | Java1匹配[\\w]ava[\\w] |
\W | 非单词字符 | $Java匹配[\\W][\\W]Java |
\s | 空白字符 | Java 2匹配Java\\s2 |
\S | 非空白字符 | Java匹配[\\S]ava |
p* | 模式p的0或多次出现 | aaaabb匹配a*bb ababab匹配(ab)* |
p+ | 模式p的1或多次出现 | a匹配a+b* able匹配(ab)+.* |
p? | 模式p的0或1次出现 | Java匹配J?Java Java匹配J?ava |
p{n} | 模式p的正好n次出现 | Java匹配Ja{1}.* Java不匹配.{2} |
p{n,} | 模式p的至少n次出现 | aaaa匹配a{1,} a不匹配{2,} |
p{n,m} | 模式p出现次数位于n和m间(不包含) | aaaa匹配啊{1,9} abb不匹配a{2,9}bb |
注意:1、单词字符包括任何的字母、数字或者下划线字符。
2、*、+、?、{n}、{n, }、{n,m}称为量词符,用于确定量词符前面的模式会重复多少次。
3、不能在重复量词符中使用空白。例如A{3,6}不能写成A{3,6}.
4、可以使用括号来将模式进行分组。例如(ab){3}匹配ababab,ab{3}abbb。
四、替换和分割字符
如果字符串匹配正则表达式,String类的matches方法放回true。string类也包含了repalceAll、replaceFirst和split方法,用于替换和分割字符串。
这是replaceAll和replaceFirst的样例。
有两个重载的split方法,split(regex)方法使用匹配的分割符将一个字符串分割为子字符串。例如
就是将字符串“JavaHTML2Perl”分割为Java、HTML以及Perl并保存在tokens[0],tokens[1]和tokens[2]中。
在split(regex,limit)方法中,limit参数确定模式匹配多少次。如果limit<=0,split(regex,limit)等同于split(regex)。如果limit>=0,模式最多匹配limit-1次。例如