判断在cat、catalog、catherine、sophisticated中是否包含Cat 预览_第1页
判断在cat、catalog、catherine、sophisticated中是否包含Cat 预览_第2页
判断在cat、catalog、catherine、sophisticated中是否包含Cat 预览_第3页
判断在cat、catalog、catherine、sophisticated中是否包含Cat 预览_第4页
判断在cat、catalog、catherine、sophisticated中是否包含Cat 预览_第5页
已阅读5页,还剩44页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

判断在cat、catalog、catherine、sophisticated中是否包含Cat字符串查找

众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力。

比如字符串中是否包含电话号码、email地址等问题。。。。

许多语言,包括Perl、PHP、Python、Javascript和Jscript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级“搜索-替换”功能。正则表达式正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。自从jdk1.4推出java.util.regex包,就为我们提供了很好的JAVA正则表达式应用平台。Java对正则表达式的处理集中在以下两个两个类:

java.util.regex.Matcher一个编译过的正则表达式。java.util.regex.Pattern模式类:用来表匹配类:用模式配一个字符串所表达的抽象结果。句点符号 句点符号匹配所有字符,包括空格、Tab字符甚至换行符

假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束。另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容。要构造出这个正则表达式,你可以使用一个通配符——句点符号“.”。这样,完整的表达式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,还匹配

“t#n”、“tpn”甚至“t

n”,还有其他许多无意义的组合。方括号符号

为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号(“[]”)里面指定看来有意义的字符。此时,只有方括号里面指定的字符才参与匹配。也就是说,正则表达式“t[aeio]n”只匹配“tan”、

“Ten”、“tin”和“ton”。但“Toon”不匹配,因为在方括号之内你只能匹配单个字符“或”符号

如果除了上面匹配的所有单词之外,你还

想要匹配“toon”,那么,你可以使用“|”操作符。“|”操作符的基本意义就是“或”运算。要匹配“toon”,使用“t(a|e|i|o|oo)n”正则表达式。这里不能使用方扩号,因为方括号只允许匹配单个字符;这里必须使用圆括号“()”。圆括号还可以用来分组表示匹配次数的符号

显示了表示匹配次数的符号,这些符号用来确定紧靠该符号左边的符号出现的次数:

假设我们要在文本文件中搜索美国的社会

安全号码。这个号码的格式是999-99-9999。用来匹配它的正则表达式如图一所示。在正则表达式中,连字符(“-”)有着特殊的意义,它表示一个范围,比如从0到9。因此,匹配社会安全号码中的连字符号时,它的前面要加上一个转义字符“\”。匹配所有123-12-1234形式的社会安全号码匹配所有123-12-1234形式的社会安全号码

假设进行搜索的时候,你希望连字符号可以出现,也可以不出现——即,999-99-9999和999999999都属于正确的格式。这时,你可以在连字符号后面加上“?”数量限定符号,

美国汽车牌照的一种格式是四个数字加上二个字母。它的正则表达式前面是数字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}图三显示了完整的正则表达式。“否”符号

“^”符号称为“否”符号。如果用在方括号内,“^”表示不想要匹配的字符。圆括号和空白符号其它符号

为简便起见,你可以使用一些为常见正则表达式创建的快捷符号。1.元字符

有些符号不是大家看到的字面上的意思:比如“.”、“!”、“?”……这些符号就称之为元字符

“\”:转义符号,在字符组内依然是元字符。检查一行文本时√“^”:脱字符:表示一行的开始^java 条件限制为以Java为开头字符√“$”:美元符号:表示一行的结束java$ 条件限制为以java为结尾字符√.条件限制除/n以外任意一个单独字符

java.. 条件限制为java后除换行外任意两个字符

“[]”:一对中括号,里面可以添加任何内容,比如[hate],括号里面的内容是或者的关系,这个正则的意义是:我想匹配一个字符,这个字符可以是h,可以是a,也可以是t或e。

记住:字符组最终只会匹配一个字符。即使你的目标字符串是hate,那么一次匹配成功的结果也只是第一个字母h,并不是整个单词,

[a-z] 条件限制在小写a

to

z范围中一个字[A-Z] 条件限制在大写A

to

Z范围中一个字符[a-zA-Z]

条件限制在小写a

to

z或大写A

to

Z范围中一个字符[0-9]条件限制在小写0

to

9范围中一个字符[0-9a-z]条件限制在小写0

to

9或a

to

z范围中个字符[0-9[a-z]]条件限制在小写0

to

9或a

to

z范围一个字符(交集)注意:字符组内的元字符和字符组外的元字符并不一样,即使字符一样,表示的意义也未必相同

“[^]”:括号里面以“^”开头,是字符组的否定形式,比如:[^hate]表示:匹配除了h、a、t、e以外的其他字符,依然只会匹配一个字符

之前刚刚学过“^”表示一行的开始,但是脱字符位于[]内的起始位置则表示否定未必相同(*)

“-”:减号,可以在字符组内表示区间、范围。比如“[a-z]”,表示匹配a到z直接的任意一个小写字母,如果是“[-z]”,那么“-”只表示它自己,没有任何特殊意义,它在字符组外也没有任何特殊意义

“|”:竖线,表示或者,这个很容易记忆,如果想匹配hate或者like,那么正则为:

“hate|like”

注意:如果想匹配I

hateyou和I

like

you。那么正则为:“I(hate|like)you”。如果写成“I

hate|like

you”,那么匹配的结果为“I

hate”或者是“like

you”了“\b”

它的作用是单词分隔符,如果我想匹配like,那么正则为“like”,没错,但是会得到一

些我不想要的结果,比如likely也会跑到结

果集中,我可不想要这些单词。那么修改正则为:“\blike\b”,这回就只能匹配like这个单词了。注意:java中的单词分隔符为“\b”

“\w”:单词字符。在java中相当于“[a-zA-Z0-9_]”。但是java中的“\b”却支持

Unicode字符。正则中的“数字”-量词√“?”

:表示0个至1个JA? J或者JA出现√“*”

:表示0个至任意多个J* 0个以上J.* 0个以上任意字符J.*D J与D之间0个以上任意字符√“+”

:表示至少一个J+ 1个以上J.+ 1个以上任意字符J.+D J与D之间1个以上任意字符限制为连续出现指定次数字符「{a}」

J{2}

JJJ{3}

JJJ文字a个以上,并且「{a,}」J{3,} JJJ,JJJJ,JJJJJ,???(3次以上J并存)文字个以上,b个以下「{a,b}」J{3,5} JJJ或JJJJ或JJJJJ

“{min,max}”:区间量词。“{2,5}”,表示匹配2到5次。“{2,}”表示至少两次,

“{2}”表示只匹配两次。“{,2}”,正则错误,无意义如上面的反面教程所说,如果想匹配一个正整数,那么应该如何来做

首先我们需要明确:我不想匹配0123,只想匹配123这样的数字,0不能开头,第二个要求就是除了数字不能有其他字符了

之前我们学过字符组了,“[0-9]”可以表示0至9中任意一个数字,那么根据上面的量词,我们改正则为“[0-9]+”,表示至少有一个数字,至多没有限制。但是0123这样的数字也会满足要求。那么我们再修改

一下,首先第一位不能为0,那么这一位可以写为“[1-9]”,表示匹

配1到9的任何一个数字,之后呢?后面的数字有没有都无所谓了,有,那就是多位数,没有,那就是一位数。所以正则为“[1-9][0-9]*”。

我想匹配一个单词,正则可以这么写“[a-zA-Z]+”基本实例A.单词1.查找单词cat正则:\bcat\b

开始的例子总是很简单,之前我们讲过了\b可以找到单词的边界,\b会匹配下面3种位置1.如果目标文本第一个字符是单词字符,则匹配第一个字符之前的位置2.如果目标文本最后一个字符是单词字符,则匹配最后一个字符之后的位置3.如果两个连续的字符中一个是单词字符一个不是,那么匹配中间位置注意:java的\b是支持Unicode字符的。2.查找多个单词之一如:匹配one或者two或three正则:\b(?:one|two|three)\b查找相似单词如:Steven、Steve、Stephen正则:\bSte(?:ven?|phen)\b

这几个单词都是以Ste开头,后面公共的部分就只有一个e了,最后的n可有可无。如果你这么想,那你的正则很有可能写成下面这样\bSte(?:v|ph)en?\b

不仔细看还真容易被糊弄过去,当然,上面3中形式都可以匹配,但是,它是不是也能匹配Stephe呢?查找除了某个单词之外的任意单词如:查找除了cat之外的任意其他单词正则:\b(?!cat\b)\w+\b

如果查找任意一个单词很容易:\b\w+\b,我们来改造一下,首先肯定要有\b,这能让我们找到单词的开头,然后我们要看看接下来的三个字母,如果他们分别是c、a、t,并且之后单词结束,那我们就不需

要,否则就是我们需要的。

“(?!cat)”,它匹配一个缝隙,这个缝隙的后面不是c、a、t,如果我们找到了这样的缝隙“(?!cat\b)”,那么这个缝隙之后的单词字符就是我们所需要的。当然我们可以把\w换成[a-zA-Z]查找不跟在某个特定单词之后的任意单如:查找之前的单词不是cat的单词正则:(?<!\bcat\W{1,9})\b\w+\b

和上一个题目很像,上一个题目要求后面不是什么什么,现在要求前面不是什么什么,所以很容易修改上面的正则:把顺序否定环视改为逆序否定环视“(?!)”->“(?<!)”。然后把环视的内容倒过来

“\W+cat\b

”->“\bcat\W+”,结果为

(?<!\bcat\W+)\b\w+\b

。.查找重复单词

如:连续写了两个相同的单词,中间空白字符相隔。正则:\b([a-zA-Z]+)\s+\1\bB.数字1.整数正则:-?[1-9]\d*|0

首先明确整数除了0之外,不能以0开头。

那么[1-9]开头,正整数即为“[1-9]\d*”,非负整数为“[1-9]\d*|0”。ps:书中的答案数字是允许以0开头的特定范围内的数字1-12(小时,月份)正则:^(1[012]|\d)$1-24(小时)正则:^(2[0-4]|1\d|[1-9])$1-31(每月的天次)正则:^(3[01]|[12]\d|[1-9])$1-53(每年的周次)正则:^(5[0-3]|[1-4]\d|[1-9])$0-59(分、秒)正则:^[1-5]?\d$0-100(百分数)正则:^([1-9]?\d|100)$1-100正则:^([1-9]\d?|100)$32-126(可打印的ASCII字符)正则:^(3[2-9]|[4-9]\d|1[01]\d|12[0-6])$•1-366(一年中的天次)正则:^([1-9]\d?|[12]\d\d|3[0-5]\d|36[0-6])$java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现:1、首先引入java包:java.util.regex2、使用方法如下共分三步:①构造一个模式.Pattern

p=Ppile("[a-z]*");②建造一个匹配器Matcher

m

=

p.matcher(str);③进行判断,得到结果boolean

b

=

m.matches();

Matcher类提供三个匹配操作方法,三个方法均返回boolean类型,当匹配到时返回true,没匹配到则返回false①m.matches()

matches()对整个字符串进行匹配,只有整个字符串都匹配了返回true②m.lookingAt()

lookingAt()对前面的字符串进行匹配,只有匹配到的字符串最前面才返回true③m.find()find()对字符串进行匹配,匹配到的字符串可以在任何位置Matcher类的其他方法int

groupcount()返回此匹配器模式中的捕获组数。

String

replaceAll(String

replacement)用给定的replacement全部替代匹配的部分String

repalceFirst(String

replacement)用给定的replacement替代第一次匹配的部分appendReplacement(StringBuffersb,Stringreplacement)根据模式用replacement

替换相应内容,并将匹配的结果添加到sb当前位置之后StringBufferappendTail(StringBuffer

sb)将输入序列中匹配之后的末尾字串添加到sb当前位置之后.group(n)

0代表永远都是匹配整个表达式的字符串的那部分

n<>0字符匹配Pattern

p

=

Ppile(expression);//正则表达式Matcher

m

=

p.matcher(str);//操作的字符串boolean

b

=

m.matches();//返回是否匹配的结果System.out.println(b);分割字符串

Pattern

pattern

=Ppile(expression);

//正则表达式String[]

strs

=

pattern.split(str);

//操作字符串得到返回的字符串数组替换字符串Pattern

p

=

Ppile(expression)//正则表达式Matcher

m

=

p.matcher(text);//操作的字符串•String

s

=

m.replaceAll(str);

//替换后的字符串查找替换指定字符串Pattern

p

=

Ppile(expression);//正则表达式Matcher

m

=

p.matcher(text);//操作的字符串StringBuffer

sb

=

new

StringBuffer();int

i

=

0;while

(m.find())

{m.appendReplacement(sb,

str);i++; //字符串出现次数}m.appendTail(sb);//从截取点将后面的字符串接上String

s

=

sb.toString();查找输出字符串Patter

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论