正则表达式(regular expression,简写为regex)是一个字符串,可以根据不同类型的数字字母组合的字符串用更加简洁的方式与其匹配,在字符串处理方面上,用处较大,所以熟练地运用它可以大程度地提高效率。
1、匹配
在Java中我们可以用String类的matches方法。在这里要与equals方法进行比较。matches方法可以匹配符合一个“模式”的字符串(也就是正则表达式),比如下面此结果便为true。
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = new String("aaaa");
String regex = "a*";
System.out.print(s.matches(regex));
}
}
2、正则表达式的各种字符以及常用语法
注意反斜杠(/)字符,表示其需要//来表示
(1)、元字符
代码 | 说明 | 示例 |
---|---|---|
. | 匹配除换行符以外的任意单个字符 | hello匹配"h.l.o" |
\w | 单词字符(字母/数字/下划线/汉字)等同于[a-z[A-Z][0-9]_]或[a-Za-z0-9_] | a2_匹配"\\w\\w\\w" |
\s | 空白字符(' '、'\t'、'\n'、'\r'、'\f'均为空白字符) | \r匹配"\\s" |
\d | 一位数字 | 23匹配"\\d3" |
\b | 单词的开始或结束 | |
^ | 字符串的开始(在集合字符里[^a]表示非(不匹配)的意思) | It's a nice day today.匹配"^It's a nice day today." |
$ | 字符串的结束 | It's a nice day today.匹配"It's a nice day today.$" |
(2)、反义字符
代码 | 说明 | 示例 |
---|---|---|
\W | 任意不是字母,数字,下划线,汉字的字符 | \r匹配"\\W" |
\S | 任意不是空白符的字符 | 23匹配"2\\S" |
\D | 任意非数字的字符 | d匹配"\\D" |
\B | 不是单词开头或结束的位置 | |
[^x] | 除了x以外的任意字符 | |
[^hello] | 除了hello这几个字母以外的任意字符 |
(3)、量词符
代码 | 说明 | 示例 |
---|---|---|
* | 重复0次或更多次 | aaa匹配"a*" |
+ | 重复1次或更多次 | a匹配"a+b*" |
? | 重复0次或1次 | d匹配"d?" |
{n} | 重复n次 | oop匹配"o{2}p" |
{n,} | 重复n次或更多次 | oppo匹配"op{1,}o" |
{n,m} | 重复n到m次(包括两端) | aab匹配"a{2,9}b" |
ps:可以使用括号让对象更加明确比如:opop匹配"(op){2}"
还可以用|来表示或
量词符都是贪婪量词,实行“贪婪分配”,下面内容会提及
(4)、常用的正则表达式语法
3、懒惰分配和贪婪分配
贪婪分配是指在匹配过程中匹配尽可能多的字符(遇到重复的符合条件的字符串)例如:
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = new String("aabab");
String regex = "a.*b";
System.out.print(s.matches(regex));
}
}
此会返回true。事实上,量词符均为贪婪量词,实行贪婪分配。倘若要使其实行懒惰分配,即:分配尽可能少的字符,则需要懒惰限定符(加问号)
代码 | 说明 |
---|---|
*? | 重复任意次,尽可能少重复 |
+? | 重复1次或更多次,尽可能少重复 |
?? | 重复0次或1次,尽可能少重复 |
{n,m}? | 重复n到m次,尽可能少重复 |
{n,}? | 重复n次以上,尽可能少重复 |
4、替换和拆分字符串
在Java的String类中有replaceAll、replaceFirst、split方法替换拆分字符串
(1)、replaceAll(替换全部)
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.print("Java Java Java".replaceAll("v\\w","wi"));
}
}
(2)、replaceFirst(只替换第一个)
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.print("Java Java Java".replaceFirst("v\\w","wi"));
}
}
(3)、split
String[] tokens = "abc1babala2hello3".split("\\d");
拆分为abc、babala、hello并分别保存在tokens[0]、tokens[1]、tokens[2]中