Java中正则表达式及Pattern和Matcher类详解
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规的代码。下面我们来由浅到深的介绍正则表达式的语法,以及在Java中常用的处理正则表达式的函数:Pattern和Matcher类。
先给出Java中常用的符号所代表的意思:
上面知道+,|,,?,^这几个符号在Java中代表有特定的意思,比如说A+代表一个或者多个A,如果我们要在字符串中表示+这个字符串怎么办呢,这时候要用到转义字符串,+在字符串中要用+代替,相应的|,,?,^这几个符号用|,*,\?,\^,来表示。字符\用\来代替,字符\用\\来代替。下面是简单的验证程序:
public class Regex {
public static void main(String[] args) {
System.out.println("\\\\");
System.out.println("\\");
System.out.println("a\+b");
}
}
输出结果如下:
\
\
a+b
其中的\\,和\确实是已经转义了,但是按照上面所说的+是个特殊字符那么“a+b”不是应该代表则一个或者多个a和一个b才对么?其实这是对正在表达式的一个误解,对于\\,\,这两个字符,不仅在正则表达式中代表特定意思而且在普通字符串中也有特定的转义意思,比如说\n代表换行,而正正则表达式是要通过java.util.regex中的函数Pattern和Matcher来实现的如下:
public class Regex {
public static void main(String[] args) {
Pattern p=Pattern.compile("a+");
//生成一个正则表达式\d
p.pattern();//返回\w,\w代表字符[a-zA-Z0-9]
System.out.println(":"+p.pattern());
//输出结果为a+
}
}
由上可知Pattern.comple()是用来生成一个正则表达式的。而p.pattern()则是这个正则表达式的值。此处可能的疑问是:不是说a+代表一个或多个a么?怎么输出来还是a+呢?其实要注意的是此处的a+也就是正则表达式的原始字符串为a+,如果我们再在其他地方用到这个a+则此时就是一个或多个a。
1.Pattern.split(CharSequence input)
Pattern有一个split(CharSequence input)方法,用于分隔字符串,并返回一个String[],我猜String.split(String regex)就是通过Pattern.split(CharSequence input)来实现的.
Java代码示例:
public static void main(String[] args) {
Pattern p=Pattern.compile("a+");
//生成一个正则表达式\d
p.pattern();//返回\w,\w代表字符[a-zA-Z0-9]
System.out.println(":"+p.pattern());
String[] str=p.split("I am love my country :china");
for(int i=0;iout.println(":"+str[i]);
}
}
}
输出结果为:
:a+
:I
:m love my country :chin
这也证明了我们上面的疑问,a+确实是一个正则表达式,pattern.compile()的作用是将一个普通的字符串转换为一个正则表达式。
2. Pattern.matches(String regex,CharSequence input)是一个静态方法,用于快速匹配字符串,该方法适合用于只匹配一次,且匹配全部字符串.下面是简单类子:
public class Regex {
public static void main(String[] args) {
Pattern p=Pattern.compile("a+");//生成一个正则表达式\d
p.pattern();//返回\w,\w代表字符[a-zA-Z0-9]
System.out.println(":"+p.pattern());
System.out.println(":"+Pattern.matches(p.pattern(), "aaaaa"));
System.out.println(":"+Pattern.matches("a\\+", "a+"));
System.out.println(":"+Pattern.matches("a+", "a+"));
}
}
输出结果:
:a+
:true
:true
由上面可知Pattern.matches()返回的是一个布尔值,如果参数里面前面的正则表达式与后面的字符串匹配则返回true,否则返回false。
Pattern.matches("a\\+", "a+")
对于这个的匹配,前面正则表达式“a\+”代表的是字符串“a+”,前面已经讲过+是正则表达式里面的特义字符,所以应该使用转义字符\+才表示+,所以结果是true,System.out.println(":"+Pattern.matches("a+", "a+"));
的输出值为false是因为:Pattern.matches("a+", "a+"))
前面的“a+”是一个正则表达式代表一个或多个a与后面的“a+”是一个字符串不匹配。
3.Pattern.matcher(CharSequence input) ,Pattern.matcher(CharSequence input)返回一个Matcher对象。Pattern类只能做一些简单的匹配操作,要想得到更强更便捷的正则匹配操作,那就需要将Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持. 下面来看看Pattern.matcher(CharSequence input)
的具体用法:
public class Regex {
public static void main(String[] args) {
Pattern p=Pattern.compile("a+");
Matcher m=p.matcher("aaaaaa");
Matcher m1=p.matcher("a+");
System.out.println(":"+m.matches()+"\n:"+m1.matches());
}
}
输出结果:
:true
:false
由上可知m.matches()返回一个boolean值。
4.Matcher.matches()/ Matcher.lookingAt()/ Matcher.find()
Matcher类提供三个匹配操作方法,三个方法均返回boolean类型,当匹配到时返回true,没匹配到则返回false ,matches()对整个字符串进行匹配,只有整个字符串都匹配了才返回true 。
public class Regex {
public static void main(String[] args) {
Pattern p=Pattern.compile("a+");
Matcher m=p.matcher("aabbaa");
System.out.println("this is the first :");
System.out.println(":"+m.find()+"\n:"+m.lookingAt()+"\n:"+m.matches());
Matcher m1=p.matcher("bbaa");
System.out.println("this is the second :");
System.out.println(":"+m1.find()+"\n:"+m1.lookingAt()+"\n:"+m1.matches());
Matcher m2=p.matcher("bb");
System.out.println("this is the last :");
System.out.println(":"+m2.find()+"\n:"+m2.lookingAt()+"\n:"+m2.matches());
}
}
输出结果:
this is the first :
:true
:true
:false
this is the second :
:true
:false
:false
this is the last :
:false
:false
:false
本文是简单的正则表达式介绍,其实正则表达式的内容十分丰富,熟练的掌握正则表达式十分的方便我们处理字符串。