微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

正则表达式最新

正则表达式

作用:

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

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

基础使用方法(使用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就是我们预先写好的匹配规则

Patternp=Pattern.compile("regex");

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

Matcherm=p.matcher("targetstring");

3、我们可以调用匹配起类matchermatchers方法,查看我们的目标字符串是否跟我们的要匹配的内容想匹配,但是注意,在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-nn表示多个),*表示0-n,而?表示0-1

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

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

Matcherm2=p2.matcher("b");

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

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

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,它跟startendgroupfind一样都有位置的记录,不会重复的去查找,除非你每次都将它的指针指回初始位置。

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

Matcherm6=p6.matcher("a12a12a12v12");

Stringt=m6.replaceAll("hello");

System.out.println(t);

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

好的,正则表达式在patternmarcher中的基本用法就差不多了。而实际上在java1.4之后,String就开始支持正则表达式了,查看API我们可以发现,它也具有matchersplitreplaceall方法,而且他们的参数名字都有一个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(regexint)

Strings="a12a12a1a12a12a";

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

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

System.out.println(b);

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

原文地址:https://www.jb51.cc/regex/362601.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐