正则表达式(最新)

来源:互联网 发布:月刃 知乎 编辑:程序博客网 时间:2024/06/14 06:03

正则表达式

作用:

字符串的匹配、字符串的替换、字符串的查找

也就是说,它的存在是给字符串操作,提供了遍历。

基础使用方法(使用matcherpattern):

java1.4以前,如果我们想使用正则表达式,我们就需要使用到java.util.regex包,使用这个包下的两个类,MatcherPattern类。

其中pattern就是我们俗称的编译类,它将我们预先写入的内容(也就是正则表达式)编译好,等到你通过matcher来匹配的时候就可以直接使用了。

正则表达式的构造摘要(挑出了一些比较重要的),下面就是一些基础的正则表达式的格式,你可以通过他们构造出复杂一些的内容。

\\代表反斜线字符      

\n换行(如果你想匹配换行你的写成\\n,第一个表示转义后面的\

[abc]  字符abc

[^abc]  非字符abc,除了abc

[a-zA-Z]  azAZ,两头的字母包括在内

[a-d[m-p]]  ad,或者mp

[a-z&&[def]]  def字符,注意前面的不能带括号

·    匹配任意字符(不能是\n,行结束符)

\d     数字

\D     非数字

\s      空白字符(包括制表符,而\t这种格式的,如果你判断“ ”是不能替换的)

\S      非空白字符

\w      单词[a-zA-Z_0-9]

\W      非单词字符[^\w]

^       行开头

*       后面无限多个

?      后面只有一个未定的

|        或者

$       行结束

Greedy 数量词

X?

X,一次或一次也没有

X*

X,零次或多次

X+

X,一次或多次

X{n}

X,恰好 n 次

X{n,}

X,至少 n 次

X{n,m}

X,至少 n 次,但是不超过 m 次

正则表达式的使用:

一、类的定义

1、创建出一个编译类对象pattern,它没有提供构造方法,我们可以通过他的的compile方法获得这么一个对象,其中的regex就是我们预先写好的匹配规则

Pattern p=Pattern.compile("regex");

2、通过编译器类获得一个匹配器对象,并将要匹配的字符串输入进去

Matcher m=p.matcher("targetstring");

3、我们可以调用匹配起类matchermatchers方法,查看我们的目标字符串是否跟我们的要匹配的内容想匹配,但是注意,在regex处的数据中使用的数据长度如果跟目标长度一致的话,那么就会返回false。像下面的eg1代码

System.out.println(m.matches());

二、匹配规则的示范

        Eg1:

        Pattern p=Pattern.compile("[a-z]");

Matcher m=p.matcher("targetstring"); 

System.out.println(m.matches());

        输出内容为false,因为我们指明的表达式只有一位[],也就是说如果targetstring是一个字母,那么它就是匹配的。因此如果我们想实现多位,可以在后面添上一个*,或者{},使用{}的在里面写入数字。就像例2

         Eg2

        Pattern p=Pattern.compile("[a-z]{12}");

Matcher m=p.matcher("targetstring"); 

System.out.println(m.matches());

        那么这种情况下使用就是正确的,因为他们位数也是一样的,同时,你也可以不写12,而写 Pattern p=Pattern.compile("[a-z]{12,}");这样表示>=12,当然你也可以在,后面写内容 Pattern p=Pattern.compile("[a-z]{12,15}");那么就表示在它们之间。

        从而,我们知道,在正则表达式中,一个[]后面跟一个{}{}里面的内容就表示内容的个数。

          Eg3

          +*、?在正则表达式中的意义

        Pattern p=Pattern.compile("[a-z]+");

Matcher m=p.matcher(""); 

System.out.println(m.matches());

        我们将上述的代码修改一下,当是上述这种形式的时候,显示的内容就是false,而?却是true,*也是true

        经过多组实验,我们可以发现它们的不同意义。他们都表示满足条件的个数

        +表示1-nn表示多个),*表示0-n,而?表示0-1

当然,上面都是很简单的一些例子。写了一些基本的正则表达式的写法,下面我们来看一下他们的组合

        Pattern p2=Pattern.compile("[^a-z]");

Matcher m2=p2.matcher("b"); 

System.out.println(m2.matches());

        当我们在我们的[a-z]前面加一个^的时候就表示相反的意思,也就是原本是az内的数,现在表示除了az的数

        Pattern p3=Pattern.compile("[^a-z&&[0-9]]");

Matcher m3=p3.matcher("b"); 

System.out.println(m3.matches());

        当我们不再满足只添加一条正则表达式的时候,我们可以进行组合,其实组合的原理很简单,将要添加的内容用[]括起来,然后与原来的规则相&&或者相|都可以

Pattern p4=Pattern.compile("[a-z|[0-9]]");

Matcher m4=p4.matcher("b"); 

System.out.println(m4.matches());

        注意,在正则表示式里面的或者只有|,而不是两根,这个特别容易犯这个错误。

好了,介绍完我们pattern类的编译规则之后,我们开始介绍我们matcher类的一些方法。

         Matcher.find()方法,寻找跟正则表达式相匹配的内容,如果没找到返回false,但是注意,如果找到,你再调用Matcher.find()方法,它不会从头开始,而是会从上次找的结束位置,也就是前面一个满足条件的末尾开始查找。

        Pattern p5=Pattern.compile("[a-z]");

Matcher m5=p5.matcher("a12a12a12v12"); 

while(m5.find()){

            //特别注意,它不会重头开始,它会从上次的结束位置开始查找

System.out.println(m5.start()+"   "+m5.end());

}

        打印结果是0   1,3   4 ,6   7 ,9   10

Pattern p5=Pattern.compile("[a-z]");

Matcher m5=p5.matcher("a12a12a12v12"); 

while(m5.find()){

System.out.println(m5.start()+"   "+m5.end());

System.out.println(m5.group());

}

        这句代码在前面的代码中多加了打印m5.group的语句,这句语句的意思就是输出满足内容的string,它跟startendgroupfind一样都有位置的记录,不会重复的去查找,除非你每次都将它的指针指回初始位置。

        Pattern p6=Pattern.compile("[a-z]");

Matcher m6=p6.matcher("a12a12a12v12"); 

String t=m6.replaceAll("hello");

System.out.println(t);

        打印结果是hello12hello12hello12hello12,replaceall的意思就是使用传入的字符串替换所有满足内容的字符,是每一个满足的替换一次,而不是只替换一处。

好的,正则表达式在patternmarcher中的基本用法就差不多了。而实际上在java1.4之后,String就开始支持正则表达式了,查看API我们可以发现,它也具有matchersplitreplaceall等方法,而且他们的参数名字都有一个叫regex的参数,这个参数的意思就是传入一个正则表达式。

    String s="a12a12a1a12a12a";

        //s.replaceAll(regex,string) regex就表示正则表达式

String f=s.replaceAll("[a-z]""hello");

System.out.println(f);

        //按照regex中的规则,将s中的小写字母都替换成为hello

          打印结果是hello12hello12hello1hello12hello12hello

        String s="a12a12a1a12a12a";

       //s.split(regex) regex为正则表达式

        String s2[]=s.split("[a-z]");

for (String string : s2) {

System.out.println(string);

}

        按照正则表达式的规则,切分字符串,后面还可跟一个整数型的数字,表示切分成为多少片s.split(regexint)

         String s="a12a12a1a12a12a";

         //s,matchers(regex)  regex为正则表达式

         boolean b=s.matches("[a-z]");

 System.out.println(b);

         查看字符串是否匹配这个正则表达式。基本原则跟上面matcher方法是一样的。