Java正则表达式详解 IIIIII.doc

上传人:飞****2 文档编号:56690690 上传时间:2022-11-03 格式:DOC 页数:7 大小:33.50KB
返回 下载 相关 举报
Java正则表达式详解 IIIIII.doc_第1页
第1页 / 共7页
Java正则表达式详解 IIIIII.doc_第2页
第2页 / 共7页
点击查看更多>>
资源描述

《Java正则表达式详解 IIIIII.doc》由会员分享,可在线阅读,更多相关《Java正则表达式详解 IIIIII.doc(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Java正则表达式详解分类:J2SE2011-11-28 14:1552人阅读评论(0)收藏举报第一篇:什么是正则表达式?在学习JAVA的正则表达式之前,先介绍一下什么是正则表达式:1、正则表达式是一种强大而灵活的文本处理工具;2、在技术上,正则表达式实现了对字符串的操作,在先前,这些任务一般都指派给了JAVA中的String、StringBuffer和StringTOkenizer这些类;3、正则表达式一般和I/O联合使用;4、正则表达式可以让我们以编程方式指定那些可以再输入字符串中发现的复杂的文本模式,一旦我们发现了这些模式,那么就可以按照任何我们所希望的方式进行处理了;5、正则表达式提供

2、了一种紧凑的、动态的语言,能够以一种完全通用的方式来解决各种字符串处理(例如:匹配、选择、编辑及验证)问题;第二篇:如何创建正则表达式?好了,看到这里我想大家对正则表达式应该已经有了一定的了解了吧,下面我来介绍一下如何创建正则表达式:要学习正则表达式就必须了解正则表达式的构造集,只有了解了构造集,掌握了模式匹配的原则和方法,你才能写出适合你需要的正则表达式,打个比方,要构造一个房屋模型,就要使用这一个个的积木,让他们以适当的方式进行拼合,构造集中的匹配符号就好像是搭建房屋模型的一个个小积木,用于创建正则表达式的完全构造列表可以在javadocs的Pattern类中找到,为了方便查询,我在这里也

3、把这些构造集列了出来,以供参考(注:摘自JDK 5.0 Documentation)资料参考:正则表达式的构造摘要1)字符x 字符 x 反斜线字符0n 带有八进制值 0 的字符 n (0 = n= 7)0nn 带有八进制值 0 的字符 nn (0 = n= 7)0mnn 带有八进制值 0 的字符 mnn(0 = m = 3、0 = n = 7)xhh 带有十六进制值 0x 的字符 hhuhhhh 带有十六进制值 0x 的字符 hhhht 制表符 (u0009)n 新行(换行)符 (u000A)r 回车符 (u000D)f 换页符 (u000C)a 报警 (bell) 符 (u0007)e 转义

4、符 (u001B)cx 对应于 x 的控制符2)字符类abc a、b 或 c(简单类)abc 任何字符,除了 a、b 或 c(否定)a-zA-Z a 到 z 或 A 到 Z,两头的字母包括在内(范围)a-dm-p a 到 d 或 m 到 p:a-dm-p(并集)a-z&def d、e 或 f(交集)a-z&bc a 到 z,除了 b和 c:ad-z(减去)a-z&m-p a 到 z,而非m 到 p:a-lq-z(减去)3)预定义字符类. 任何字符(与行结束符可能匹配也可能不匹配)d 数字:0-9D 非数字: 0-9s 空白字符: tnx0BfrS 非空白字符:sw 单词字符:a-zA-Z_0-

5、9W 非单词字符:w4)POSIX 字符类(仅 US-ASCII)pLower 小写字母字符:a-zpUpper 大写字母字符:A-ZpASCII 所有 ASCII:x00-x7FpAlpha 字母字符:pLowerpUpperpDigit 十进制数字:0-9pAlnum 字母数字字符:pAlphapDigitpPunct 标点符号:!#$%&()*+,-./:;?_|pGraph 可见字符:pAlnumpPunctpPrint 可打印字符:pGraphx20pBlank 空格或制表符: tpCntrl 控制字符:x00-x1Fx7FpXDigit 十六进制数字:0-9a-fA-FpSpace

6、 空白字符: tnx0Bfr5)java.lang.Character 类(简单的java 字符类型)pjavaLowerCase 等效于 java.lang.Character.isLowerCase()pjavaUpperCase 等效于 java.lang.Character.isUpperCase()pjavaWhitespace 等效于 java.lang.Character.isWhitespace()pjavaMirrored 等效于 java.lang.Character.isMirrored()6)Unicode 块和类别的类pInGreek Greek 块(简单块)中的字符

7、pLu 大写字母(简单类别)pSc 货币符号PInGreek 所有字符,Greek 块中的除外(否定)pL&pLu 所有字母,大写字母除外(减去)7)边界匹配器 行的开头$ 行的结尾b 单词边界B 非单词边界A 输入的开头G 上一个匹配的结尾Z 输入的结尾,仅用于最后的结束符(如果有的话)z 输入的结尾8)Greedy 数量词X? X,一次或一次也没有X* X,零次或多次X+ X,一次或多次Xn X,恰好 n 次Xn, X,至少 n 次Xn,m X,至少 n 次,但是不超过 m 次9)Reluctant 数量词X? X,一次或一次也没有X*? X,零次或多次X+?X,一次或多次Xn? X,恰好

8、 n 次Xn,? X,至少 n 次Xn,m? X,至少 n 次,但是不超过 m 次10)Possessive 数量词X?+ X,一次或一次也没有X*+ X,零次或多次X+ X,一次或多次Xn+ X,恰好 n 次Xn,+ X,至少 n 次Xn,m+ X,至少 n 次,但是不超过 m 次11)Logical 运算符XY X 后跟 YX|Y X 或 Y(X) X,作为捕获组12)Back 引用n 任何匹配的 nth 捕获组13)引用 Nothing,但是引用以下字符Q Nothing,但是引用所有字符,直到 EE Nothing,但是结束从 Q 开始的引用14)特殊构造(非捕获)(?:X) X,作为

9、非捕获组(?idmsux-idmsux) Nothing,但是将匹配标志由 on 转为 off(?idmsux-idmsux:X) X,作为带有给定标志 on - off 的非捕获组(?=X) X,通过零宽度的正 lookahead(?!X) X,通过零宽度的负 lookahead(?=X) X,通过零宽度的正 lookbehind(?X) X,作为独立的非捕获组作为一个例子,下面的每一个表达式都是合法的正则表达式,并且所有表达式都会成功匹配字符序列Rudolph。第一个:Rudolph 注:就是单词本身,绝对匹配;第二个:rRudolph 注:第一个字母可以在 r 和 R 中选择一个匹配,所

10、以也能成功;第三个:rRaeioua-zol.* 注:第一个字母在 r 和 R 中匹配,第二个字母在原音字母aeiou中匹配,第三个字母在a到z的26个字母中匹配,第四个字母和第五个字母被绝对匹配,后面的字符可以是任意的,因此这样的匹配也能成功;第四个:R.* 注:第一个字母被绝对匹配,后面的字符可以是任意的匹配原则,所以也成功了。在这个例子中遇到了一个.*的匹配符号,在这里我只解释:. 代表任何字符、* 代表任何字符即.可以出现零次或多次,这是一个非常常用的匹配符号,大家最好能够记住。类似的,要想写出符合自己需求的正则表达式,可以参照构造类表对各类字符,以及匹配原则和方法的规定实现。第三篇:

11、正则表达式中的一个重要概念:量词为 什么说量词是正则表达式中的一个重要的概念呢,如何有Java编程思想一书的同学可以看到,量词被放到了单独的一个章节进行了讲述,由此可见其一同一 般,主要是因为量词构造集在正则表示式的编写的时候是使用率非常平凡的构造集,也可以理解为是正则表达式的一个灵魂,所以要重视它的重要性。量词,字面上的理解就是数量词,在正则表达式它又是被如何重新理解的呢?在Java编程思想一书中的定义是:“量词描述了一个模式吸收输入文本的方式”,这里的方式被分为三种:贪婪的、勉强的、占有的。通俗的解释可以是这样的:对一个字符或字符串在对出现次数上进行的限制和匹配。在上面的构造集中也写出了这

12、三种方式的匹配标准,这里就不做介绍了,对于这三种方式有什么区别,我给出Java编程思想一书做出的解释,大家可以根据自己的业务需要进行选择。1)贪婪的。量词总是贪婪的,除非有其他的选项被设置。贪婪表达式会为所有可能的模式发现尽可能多的匹配。导致此问题的一个典型理由就是假定我们的模式仅能匹配第一个可能的字符组,如果它是贪婪的,那么它就会继续往下匹配。2)勉强的。有问号来指定,这个量词匹配满足模式所需的最少字符数。因此也称作懒惰的,最少匹配的,非贪婪的、或不贪婪的。3) 占有的。量词当前只有在JAVA语言中才可用(在其他语言中不可用),并且它也是更高级,因此我们大概不会立刻用到它。当正则表达式被应用

13、于字符串时,它会产生相当多的状态,以便在匹配失败时可以回溯。而占有的量词并不保存这些中间状态,因此我们可以防止回溯。它们常常由于防止正则表达式失控,因此可以使 正则表达式执行起来更有效。注意点:在使用量词的时候,最好将要使用量词的字符或字符串有括号括起来;第四篇:模式与匹配器在介绍了一些正则表达式的基础之后,下面说说正则表达式在Java中是如何体现的,说的更明白一些也就是在Java中如何实现、如何编写代码。在Java中,正则表达式是通过java.util.regex包中的Pattern和Matcher两个类来实现的。一个Pattern对象表示一个正则表达式的 编译版本,可以做类似的对比,就好像

14、是java文件和class文件,一个是让程序员看的,一个是让虚拟机执行的,在Java中一个正则表达式要转换为 Pattern对象才能最终被使用,Pattern的complie()方法可以实现,同时,我们可以使用matcher()方法和输入字符串从编译过的 Pattern对象中产生Matcher对象,在Matcher中可以得到你想要得到的处理完成以后的结果值的信息。下来介绍Matcher类中的几个重要方法:1)find():用户发现应用于CharSequence(即输入的字符串)的多重模式匹配,find()就像是一种迭代器,可以在输入字符串中向前移动迭代,在find()的第二版中,可以指定一个整

15、型参数以告知要开始搜索的字符的位置;2)groupCount():在介绍这个方法的之前,现介绍一个概念:“组” 组是由圆括号分开的多个正则表达式,随后可以根据它们的组号进行调用。第0组表示整个匹配表达式,第1组表示第一个用圆括号括起来的组,等等,因此,在表达式A(B(C)D中有三个组:第0组ABCD,第1组BC,第2组C。 groupCount()方法返回该模式中分组的数目。要注意的是第0组不包括在内。3)group():返回由以前匹配操作所匹配的输入子序列。4)group(int i):返回在以前匹配操作期间由给定组捕获的输入子序列。如果匹配成功,但是指定的组没有匹配输入字符串的任何部分,将

16、返回null。5)start(int group):返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引。6)end(int group):返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。7)start(): 返回以前匹配的初始索引。8)end(): 返回最后匹配字符之后的偏移量。模式标记:模式标记是可以影响正则表达式的匹配行为的标记参数,为方便理解,列出这些标记的作用:Pattern.CANON_EQ :启用规范等价。Pattern.CASE_INSENSITIVE :启用不区分大小写的匹配。Pattern.COMMENTS :模式中允许空白和注释。Pattern

17、.DOTALL :启用 dotall 模式,在dotall模式中,表达式.匹配多有字符,包括行终结符,缺省情况下,.表达式不匹配行终结符。Pattern.LITERAL :启用模式的字面值分析。Pattern.MULTILINE :启用多行模式。Pattern.UNICODE_CASE :启用 Unicode 感知的大小写折叠。Pattern.UNIX_LINES :启用 Unix 行模式。替换操作:替换操作在正则表达式中起了尤为重要的作用,能够实现替换操作的几个方法是:1)replaceFirst(String replacement) :用replacement替换输入字符串中最先匹配的部

18、分。2)replaceAll(String replacement) :用replacement替换输入字符串中所有匹配的部分。3) appendReplacement(StringBuffer sb, Stringreplacement) :逐步的在sb中执行替换;而不是像replaceFirst()那样仅替换第一个匹配,或者像replaceAll()那样替换所有的匹配。这是个非常 重要的方法,因为它允许我们通过调用某些方法来执行一些其他处理来产生replacement(而不像replaceFirst()和 replaceAll()只能输入固定字符串)。有了这个方法,我们就可以通过编程来实现

19、将目标拆分成组以及创建功能强大的替换。4)appendTail(StringBuffer sb) :在一个或多个appendReplacement()调用之后被调用,以便复制输入字符串的剩余部分。reset(String s)方法:可以将Matcher对象应用于一个新的字符序列。到 此为止,正则表达式在Java中的一般应用就差不多了,如果想要了解更多关于正则表达式在Java中的使用可以参考Java编程思想、 Mastering Regular Expression(第二版),Jeffrey E.F.Friedl著(OReilly,2002)。正则表达式的应用实例:package Aaron;i

20、mport java.util.*;import java.util.regex.*;public class Main public Main() public static void main(String arg) main.emailMRE(lzq_3180); main.replaceMRE(3.23+4.34433-34433.3434,f); /* * 验证email的正则表达式 * param textStr String */ public void emailMRE(String textStr) String mre = w+w+.w+; Pattern p = Ppil

21、e(mre); Matcher m = p.matcher(textStr); if (m.find() System.out.println(验证成功!); else System.out.println(验证失败!); /* * 将指定格式的字符串替换成要求的字符,本例中将表达式中的浮点数提取出来替换, * 浮点数的精度要求为整数位1-8位,小数位1-8位 * 同时,将检索出的浮点数的位置在控制台输出 * param textStr String */ public void replaceMRE(String textStr, String requestStr) String mre

22、= d1,8.d1,8; StringBuffer sb = newStringBuffer(); Pattern p = Ppile(mre); Matcher m = p.matcher(textStr); int i = 1; while (m.find() System.out.println(找到第 +i+ 个匹配: + m.group()+ 位置为: +m.start() + - + (m.end()-1);m.appendReplacement(sb, requestStr); i+; m.appendTail(sb); System.out.println(替换后的结果字符串为: + sb); 运行结果:验证成功!找到第1个匹配:3.23 位置为:0-3找到第2个匹配:4.34433 位置为:5-11找到第3个匹配:34433.3434 位置为:13-22替换后的结果字符串为:f+f-f

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁