正则表达式
作用:
字符串的匹配、字符串的替换、字符串的查找
也就是说,它的存在是给字符串操作,提供了遍历。
基础使用方法(使用matcher和pattern):
在java1.4以前,如果我们想使用正则表达式,我们就需要使用到java.util.regex包,使用这个包下的两个类,Matcher和Pattern类。
其中pattern就是我们俗称的编译类,它将我们预先写入的内容(也就是正则表达式)编译好,等到你通过matcher来匹配的时候就可以直接使用了。
正则表达式的构造摘要(挑出了一些比较重要的),下面就是一些基础的正则表达式的格式,你可以通过他们构造出复杂一些的内容。
\n换行(如果你想匹配换行你的写成\\n,第一个表示转义后面的\) [abc]字符abc [^abc]非字符abc,除了abc [a-zA-Z]a到z,A到Z,两头的字母包括在内 [a-d[m-p]]a到d,或者m到p [a-z&&[def]]def字符,注意前面的不能带括号 ·匹配任意字符(不能是\n,行结束符) \d数字 \D非数字 \s空白字符(包括制表符,而\t这种格式的,如果你判断“”是不能替换的) \S非空白字符 \w单词[a-zA-Z_0-9] \W非单词字符[^\w] ^行开头 *后面无限多个 ?后面只有一个未定的 |或者 $行结束
|
正则表达式的使用:
一、类的定义
1、创建出一个编译类对象pattern,它没有提供构造方法,我们可以通过他的的compile方法获得这么一个对象,其中的regex就是我们预先写好的匹配规则 Patternp=Pattern.compile("regex"); 2、通过编译器类获得一个匹配器对象,并将要匹配的字符串输入进去 Matcherm=p.matcher("targetstring"); 3、我们可以调用匹配起类matcher的matchers方法,查看我们的目标字符串是否跟我们的要匹配的内容想匹配,但是注意,在regex处的数据中使用的数据长度如果跟目标长度一致的话,那么就会返回false。像下面的eg1代码 System.out.println(m.matches()); |
二、匹配规则的示范
Eg1: Patternp=Pattern.compile("[a-z]"); Matcherm=p.matcher("targetstring"); System.out.println(m.matches()); 输出内容为false,因为我们指明的表达式只有一位[],也就是说如果targetstring是一个字母,那么它就是匹配的。因此如果我们想实现多位,可以在后面添上一个*,或者{},使用{}的在里面写入数字。就像例2 |
Eg2: Patternp=Pattern.compile("[a-z]{12}"); Matcherm=p.matcher(out.println(m.matches()); 那么这种情况下使用就是正确的,因为他们位数也是一样的,同时,你也可以不写12,而写Patternp=Pattern.compile("[a-z]{12,}");这样表示>=12,当然你也可以在,后面写内容Patternp=Pattern.compile(}");那么就表示在它们之间。 |
Eg3: +、*、?在正则表达式中的意义 Patternp=Pattern.compile("[a-z]+"); Matcherm=p.matcher(""); System.out.println(m.matches()); 我们将上述的代码修改一下,当是上述这种形式的时候,显示的内容就是false,而?却是true,*也是true。 经过多组实验,我们可以发现它们的不同意义。他们都表示满足条件的个数 +表示1-n(n表示多个),*表示0-n,而?表示0-1 |
当然,上面都是很简单的一些例子。写了一些基本的正则表达式的写法,下面我们来看一下他们的组合
Patternp2=Pattern.compile("[^a-z]"); Matcherm2=p2.matcher("b"); System.out.println(m2.matches()); 当我们在我们的[a-z]前面加一个^的时候就表示相反的意思,也就是原本是a到z内的数,现在表示除了a到z的数 |
Patternp3=Pattern.compile("[^a-z&&[0-9]]"); Matcherm3=p3.matcher(out.println(m3.matches()); 当我们不再满足只添加一条正则表达式的时候,我们可以进行组合,其实组合的原理很简单,将要添加的内容用[]括起来,然后与原来的规则相&&或者相|都可以 |
Patternp4=Pattern.compile("[a-z|[0-9]]"); Matcherm4=p4.matcher(out.println(m4.matches()); 注意,在正则表示式里面的或者只有|,而不是两根,这个特别容易犯这个错误。 |
好了,介绍完我们pattern类的编译规则之后,我们开始介绍我们matcher类的一些方法。
Matcher.find()方法,寻找跟正则表达式相匹配的内容,如果没找到返回false,但是注意,如果找到,你再调用Matcher.find()方法,它不会从头开始,而是会从上次找的结束位置,也就是前面一个满足条件的末尾开始查找。 Patternp5=Pattern.compile("[a-z]"); Matcherm5=p5.matcher("a12a12a12v12"); while(m5.find()){ //特别注意,它不会重头开始,它会从上次的结束位置开始查找 System.out.println(m5.start()+""+m5.end()); } 打印结果是01,34,67,910 |
Patternp5=Pattern.compile(while(m5.find()){ System.""+m5.end()); System.out.println(m5.group()); } 这句代码在前面的代码中多加了打印m5.group的语句,这句语句的意思就是输出满足内容的string,它跟start、end、group、find一样都有位置的记录,不会重复的去查找,除非你每次都将它的指针指回初始位置。 |
Patternp6=Pattern.compile("[a-z]"); Matcherm6=p6.matcher("a12a12a12v12"); Stringt=m6.replaceAll("hello"); System.out.println(t); 打印结果是hello12hello12hello12hello12,replaceall的意思就是使用传入的字符串替换所有满足内容的字符,是每一个满足的替换一次,而不是只替换一处。 |
好的,正则表达式在pattern和marcher中的基本用法就差不多了。而实际上在java1.4之后,String就开始支持正则表达式了,查看API我们可以发现,它也具有matcher、split、replaceall等方法,而且他们的参数名字都有一个叫regex的参数,这个参数的意思就是传入一个正则表达式。
Strings="a12a12a1a12a12a"; //s.replaceAll(regex,string)regex就表示正则表达式 Stringf=s.replaceAll("[a-z]",out.println(f); //按照regex中的规则,将s中的小写字母都替换成为hello, 打印结果是hello12hello12hello1hello12hello12hello |
Strings=//s.split(regex)regex为正则表达式 Strings2[]=s.split("[a-z]"); for(Stringstring:s2){ System.out.println(string); } 按照正则表达式的规则,切分字符串,后面还可跟一个整数型的数字,表示切分成为多少片s.split(regex,int) |
Strings="a12a12a1a12a12a"; //s,matchers(regex)regex为正则表达式 booleanb=s.matches("[a-z]"); System.out.println(b); 查看字符串是否匹配这个正则表达式。基本原则跟上面matcher方法是一样的。 |