这次介绍一些操作文本的方法和一些注意事项。
一、String类方法
在String类内部,有一个替换字符(串)的方法
replaceAll(String regex,String replacement)
,他接受两个参数,一个正则表达式
(regex)
和一个用来替换的字符串
(replacement)
用法:
public class Test{
public static void main(String[] args){
System.out.println("abc234def456".replaceAll("\\d{1,3}", "-"));
}
}
上面的代码,输出为
abc-def-
,也就是说,这个方法会把所有字符串中找到的匹配正则表达式的字串都替换为你想要字符串。
二、类Matcher方法
这里只讲一些Matcher的方法:find()与matches(),LookingAt(),最后在说一下Pattern中的方法compile().
matches()方法返回为Boolean类型,其匹配整个字符串,也就是给定一个正则表达式,在给定一个字符串,只有当整个表达式都和这一个字符串相匹配才返回true,否则返回false.方法find()返回值也是Boolean,但是他的意思是在给定的字符串中找与给定正则表达式匹配的子串。看下面的例子:
import java.util.regex.*;
public class Test{
public static void main(String[] args){
Pattern p = Pattern.compile("\\w{3}");
String alph = "abc";
Matcher m = p.matcher(alph)
System.out.println(m.matches());
}
}
import java.util.regex.*;
public class Test{
public static void main(String[] args){
Pattern p = p.compile("\\d{3}");
Matcher m = p.matcher("vcvc234v345");
while(m.find()){
System.out.println(m.group());
}
}
}
很容易知道,第一段代码打印true,第二段意思是把找到的三个数字的字符串打印出来,所以会打印两个字符串
234
和
345
,因为他是找符合条件的字串。
看下面例子:
import java.util.regex.*;
public class Test{
public static void main(String[] args){
String s = "123-3454-6543-2334";
Pattern p = Pattern.compile("\\d{3,5}");
Matcher m = p.matcher(s);
System.out.println(m.matches());
//m.reset();
System.out.println(m.find());
System.out.println(m.find());
System.out.println(m.find());
System.out.println(m.find());
}
}
想一哈上面会怎么打印?按照上面我所说的,应该会打印
false,true,true,true,true
,才对,但是实际情况却是
false,true,true,true,false
,为什么呢?注意我在上面的代码中注释了一个方法reset(),如果去掉注释,那么就会正常打印
false,true,true,true,false
了,这是因为不管是matches()还是find();他去匹配字符串时,只要匹配到了相应的字符,就会打个标记,下次在匹配时,就从这个标记开始,如上面的
System.out.println(m.matches());
这个语句,匹配
String s = "123-3454-6543-2334";
时,在第四个字符开始就不匹配了,此时会在这里做个标记,再调用find()方法时,就从标记的开始进行匹配,而不是从头开始匹配,find()方法也是这样,匹配到了某个字串,就做个记号,下次匹配就从记号开始匹配,所以上面最后一个打印false,如果要从头开始匹配,此时,可以把注释去掉,方法reset()的意思就是清除记号,从头开始匹配。
import java.util.regex.*;
public class Test{
public static void main(String[] args){
String s = "123-3454-6543-2334";
Pattern p = Pattern.compile("\\d{3,5}");
Matcher m = p.matcher(s);
System.out.println(m.lookingAt());
System.out.println(m.lookingAt());
System.out.println(m.lookingAt());
System.out.println(m.lookingAt());
System.out.println(m.lookingAt());
}
}
上面代码会打印5个
true
这是因为
lookingAt()
方法表示每次都从头开始匹配,它和方法
matches()
差不多,不同的是,他不会匹配整个字符串,而是匹配一个与正则表达式相符的子串,这一点和
find()
相似。
说一下
Pattern
的方法
compile()
;这个方法可以接受了两个参数或者一个参数,上面的代码都接受的一个参数,而如果你要对匹配的正则表达式进行一大小写限制等就可以用
compilse(String regex, int flag)
,其中flag包括的常量有CASE_INSENSITIVE(不区分大小写),MULTILINE(多行)等,看下面的例子:
public class Test{
public static void main(String[] args){
String s = "java JAVA jAvA you loveJava hataJavA ";
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(s);
while(m.find()){
System.out.println(m.group());
}
}
}
上面会打印所有
java
不区分大小写的子串。
最后说下分组
(group())
的问题,在一个正则表达式中,往往需要多个表达式来匹配一个需要的字符串,这时候,如果想要对其中一个表达式匹配的值进行操作,应该怎么办呢?这时候,方法group()就派上用场了。
对一个表达式分组,可以用括号
()
来完成,并规定,从左到右,第一个左括号为第一组,第二个为第二组,以此类推。看下面的例子:
public class Test{
public static void main(String[] args){
String s = "2332fasdf"
Pattern p = Pattern.compile("(\\d{4}(\\w{5}))");
Matcher m = p.matcher(s);
m.matches();
System.out.println(m.group(1));
System.out.println(m.group(2));
System.out.println(m.group());
System.out.println(m.group(0));
}
}
上面代码,打印如下所示
可以看出,第三四个打印的一模一样,也就是说整个正则表达式中,组号为0是表示整个表达式的,而group()也是表示整个表达式的。