




免费预览已结束,剩余102页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十三章字符串 字符串 正则表达式 一 String类 1 String类的概念 String对象是字符串常量 theirvaluescannotbechangedaftertheyarecreated 当一个String对象被创建以后 它们的值不会再被改变 典例 下面的程序有没有问题 如果没有问题 其运行结果是什么 publicclassTestString publicstaticvoidmain String args Strings abc s String System out println Thestringis s 分析 Strings abc 注意 Strings abc 其实是下列语句的简化形式 Strings newString abc 首先 声明一个指向String对象的引用s 其次 在堆内存中为对象申请一个存储空间 调用构造函数对该对象进行初始化 返回对该对象的引用 归纳 s指向刚创建的这个字符串对象 分析 s String 在堆内存中为新对象重新申请一个存储空间 调用构造函数对该对象进行初始化 返回对该对象的引用 归纳 s指向新创建的这个字符串对象 问题 原先的那个字符串对象呢 一 String类 2 String类的声明 publicfinalclassStringextendsObjectimplementsSerializable Comparable CharSequence publicinterfaceCharSequence 此接口从类CharBuffer String StringBuffer StringBuilder中抽象出字符串的一般化定义 interfaceCharSequence charAt inti length subSequence intstart intend toString 进一步分析CharSequence接口 此接口并没有重新定义通用的equals和hashCode方法 因此没有对实现CharSequence的两个对象如何进行比较给出定义 每个对象可能由不同的类实现 因此不能随意的对两个对象进行比较 所以将CharSequence对象作为set的元素或者map的关键字都是不合适的 一 String类 3 String类的构造函数 共有15个构造函数 利用各种不同的参数来创建String对象 我们随意挑选其中一个构造函数来分析 String Stringoriginal 初始化一个新创建的字符串对象 使其表示一个与参数相同的字符序列 换句话说 新创建的字符串对象是该参数的字符串对象的副本 一 String类 4 String类的方法 共有65个方法 详细资料请参阅官方文档和课本P288 仔细分析String类的这些方法 我们可以发现 当需要改变字符串的内容时 String类的方法都会返回一个新的String对象同时 如果内容没有改变 String类的方法只是返回一个指向原对象的引用而已 这样可以节约存储空间以及避免额外的开销 二 关于String类的两点补充 1 作为参数的String对象 如果String对象作为参数 传递的是该对象的引用而非对象本身 典例分析 P283 我们应该也有能力写出这样的测试程序 publicclassImmutable publicstaticStringupcase Strings returns toUpperCase publicstaticvoidmain String args Stringq howdy print q howdyStringqq upcase q print qq HOWDYprint q howdy 2 String对象的操作符重载 用于String的 与 是Java中仅有的两个重载过的操作符 Java设计者认为操作符重载太过复杂 二 关于String类的两点补充 publicclassConcatenation publicstaticvoidmain String args Stringmango mango Strings abc mango def 47 System out println s 产生一大堆的需要垃圾回收器回收的中间对象 使用StringBuilder类进行优化 反编译可观察 1 StringBuffer类的概念 一个类似于String的字符串缓冲区 但是可以进行修改 三 StringBuffer类 2 StringBuffer类的声明 publicfinalclassStringBufferextendsObjectimplementsSerializable CharSequence 三 StringBuffer类 3 StringBuffer类的构造函数和方法 具有4个构造函数和51个方法 更详细资料请参阅官方文档 三 StringBuffer类 StringBuffer上的主要操作是append和insert方法 可重载这些方法 以接受任意类型的数据 每个方法都能有效地将给定的数据转换成字符串再将该字符串的字符追加或插入到字符串缓冲区 append方法始终将这些字符追加到缓冲区的末端而insert方法则在指定的位置插入字符 4 归纳 StringBuffer是一个线程安全的可变字符序列 补充资料 Java中的同步和异步 三 StringBuffer类 1 性质 同步是线程安全的 异步不是线程安全的 下面一步步来分析和证明这一点 首先 在我们前面所分析的各种各样的容器中 ArrayList和HashMap是异步 而Vector和HashTable是同步 当创建一个Vector对象时候 Vectorve newVector ve add 1 在多线程的应用程序中 当第一个线程发生调用 试图修改对象ve的时候 操作系统就为其上了锁 这时候 其他的线程只有等待 当创建一个ArrayList对象时候 ArrayListlist newArrayList list add 1 在多线程的应用程序中 当第一个线程发生调用 试图修改对象list的时候 操作系统并没有上锁 这时候 其他线程访问时会报错 2 回到StringBuffer这个话题 Java从JDKSE5开始 为该类补充了一个单个线程使用的等价类 即StringBuilder 与该类相比 在单线程的情况下应该优先使用StringBuilder类 它支持所有相同的操作 但是由于不执行同步 所以速度更快 1 StringBuilder类的概念 参见前面分析 四 StringBuilder类 2 StringBuilder类的声明 publicfinalclassStringBuilderextendsObjectimplementsSerializable CharSequence 四 StringBuilder类 3 StringBuilder类的构造函数 具有4个构造函数 更详细资料请参阅官方文档 四 StringBuilder类 4 StringBuilder类的方法 51个 StringBuilder提供了丰富而全面的方法 包括insert delete replace和substring 但最常用的还是append和toString 四 StringBuilder类 所有的容器类都具有toString方法 并且重新改写了这个方法 通过下面典例 我们再次分析toString的作用 五 无意识的递归 有趣的一个例子 编译器将this转换成一个String 怎么转换呢 正是利用toString 于是发生了递归调用 1 C语言中格式化输出语句 printf printf使用一个简单的格式化字符串 将值插入其中 然后格式化输出 六 格式化输出 printf并不使用重载的 操作符 C没有重载 来连接括号内的字符串或字符串变量 而是使用特殊的占位符来表示数据将来的位置 例如 printf Row1 d f n x y 这些占位符称为格式化修饰符 它们不但说明了插入数据的位置 同时还说明了将插入什么类型的数据 以及如何对其格式化 2 format方法 JavaSE5引入的format方法可以用于PrintStream或PrintWriter对象 当然其中也包括System out对象 六 格式化输出 format方法模仿自C语言的printf 如果你比较怀旧的话 也可使用printf 典例分析 P290 六 格式化输出 可以看到 format方法与printf方法是等价的 3 Formatter类 格式化器 Formatter类的概念 我们可以将Formatter的对象看成一个翻译器 它将你的格式化字符串与数据翻译成所需要的结果 六 格式化输出 java util Formatter类的声明 publicfinalclassFormatterextendsObjectimplementsCloseable Flushable 六 格式化输出 Formatter类的构造函数 具有14个构造函数 六 格式化输出 Formatter的构造函数经过重载可以接受多种输出目的 不过最常用的还是PrintStream OutputStream和File 如下所示 Formatter PrintStreamps ConstructsanewformatterwiththespecifiedPrintStream 利用指定的PrintStream 创建一个格式化器 Formatter类的方法 具有7个方法 更详细资料请参阅官方文档 六 格式化输出 在这些方法中 最值得注意的是format方法 publicFormatterformat Stringformat Object args 功能 简单而言 就是利用指定的格式字符串 对可变参数列表进行格式化输出 典例如下 归纳 使用格式化器的步骤 首先 定义一个格式化器的对象 其次 调用该对象的format 方法 利用指定的格式化字符串 对指定的可变参数规定其格式化输出方式 4 格式化说明符 了解 在插入数据时 如果想要控制空格与对齐 需要更精细复杂度格式修饰符 语法细节过于繁缛 六 格式化输出 1 正则表达式的概念 正则表达式是一种功能强大而又不失灵活的文本处理工具 七 正则表达式基础知识 使用正则表达式 我们就能够以编程的方式 构造复杂的文本模式 并利用它对输入的字符串进行匹配 一旦找到了匹配这些模式的部分 你就可以随心所欲对它们进行各种处理 七 正则表达式基础知识 2 正则表达式的基础知识 从最简单的正则表达式开始分析 七 正则表达式基础知识 1 我们先从最简单的开始 假设你要搜索一个包含字符 cat 的字符串 搜索用的正则表达式就是 cat 本身 如果搜索对大小写不敏感 单词 catalog Catherine sophisticated 都可以匹配 2 句点符号 假设你在玩英文拼字游戏 想要找出三个字母的单词 而且这些单词必须以 t 字母开头 以 n 字母结束 另外 假设手上有一本英文字典 而你正是用正则表达式来搜索该字典的全部内容 要构造这个正则表达式 你可以使用一个通配符句点符号 即完整的正则表达式为 t n 它除了匹配 tan ten tin 和 ton 还可以匹配 t n tpn 甚至 tn 等等 归纳 句点符号匹配所有字符 包括空格 Tab字符甚至换行符 3 方括号符号 为了解决句点符号匹配范围过于广泛这一问题 你可在方括号 里面指定看来有意义的字符此时 只有方括号里面指定的字符才参与匹配 例如 正则表达式 t aeio n 只能匹配 tan Ten tin 和 ton 但是 T n Tpn Tn 以及 Toon 都不能匹配 4 或符号 除了上面能够匹配的所有单词之外 如果你还想要匹配 toon 那么 你可以使用或 操作符 操作符的基本意义就是或运算 典例 如果要匹配 toon 使用 t a e i o oo n 正则表达式 注意 这里不能使用方扩号 因为方括号只允许匹配单个字符 这里必须使用圆括号 圆括号还可以用来分组 具体请参见后面介绍 5 表示匹配次数的符号 下表显示了表示匹配次数的符号 这些符号用来确定紧靠该符号左边的符号出现的次数 假设我们要在文件中搜索美国的社会安全号码这个号码的格式是999 99 9999 用来匹配它的正则表达式如下图所示 连字符 有着特殊的意义 它表示一个范围 比如从0到9 因此 在匹配社会安全号码中的连字符号时 前面要加上一个转义字符 假设进行搜索的时候 你希望连字符可以出现 也可以不出现 即 999 99 9999和999999999都属于正确的格式 这时 你可以在连字符号后面加上 数量限定符号 如下图所示 下面我们再来看另外一个例子 美国汽车牌照的一种格式是四个数字加上二个字母 它的正则表达式前面是 数字部分 0 9 4 再加上字母部分 A Z 2 如下图所示 6 否符号 如果用在方括号内 表示不想要匹配的字符 例如 下图的正则表达式匹配所有单词 但是以 X 字母开头的单词除外 7 圆括号和空白符号 假设从格式为 June26 1951 的日期中提取出月份部分 匹配该日期的正则表达式可以如下图所示 s 符号是空白符号 匹配所有的空白字符 包括Tab字符 8 其它符号 为简便起见 你可以使用一些为常见正则表达式创建的快捷符号 如下表所示 例如 在前面社会安全号码的例子中 所有出现 0 9 的地方我们都可以使用 d 修改后的正则表达式如下图所示 1 Java对反斜线处理的问题 反斜线字符 表示转义字符 典例 r表示普通字符r r转义字符 表示换行 八 Java中的正则表达式 问题 如果我们要处理的字符 正好就是反斜线本身呢 约定 在Java语言中 表示要插入正则表达式的反斜线 并且后面的字符有特殊意义 典例 如果你要表示一位数字 正则表达式应该是 d 如果你想插入一个普通的反斜线 则应该这样 不过空白字符 whitespacecharacter 指换行符和制表符之类的符号 只需要使用单反斜线例如 n t等等 2 Java中的正则表达式所使用符号 更详细资料请参阅官方文档 八 Java中的正则表达式 3 String类自带了一个非常有用的正则表达式工具 Spilt方法 八 Java中的正则表达式 格式 publicString split Stringregex 其中 regex表示正则表达式 八 Java中的正则表达式 功能 将字符串从正则表达式匹配的地方切开 注意 切开以后的字符串子串将放入到一个字符串数组中 八 Java中的正则表达式 分析 第一个语句 使用普通的字符作为正则表达式 其中并不包含任何特殊的字符 因此 第一个spilt 只是按空格来划分字符串 第二个语句 正则表达式 W 表示以一个非单词字符打头 后面跟着若干个非单词字符 第三个语句 正则表达式 n W 表示字母n后面跟着若干个非单词字符 归纳 在原始字符串中 与正则表达式相匹配的部分 在最终结果中都不存在了 4 归纳 我们的目的并不是编写最难理解的正则表达式 而是尽量编写能够完成任务的 最简单以及最必要的正则表达式 关键在于 参考别人用的正则表达式 八 Java中的正则表达式 1 软件包 java util regex 是一个用正则表达式所定制的模板来对字符串进行匹配工作的类库包 与String相比 功能更为强大 九 Pattern和Matcher 该软件包包括一个接口和两个类 MatchResult接口 匹配操作的结果 Pattern类和Matcher类 九 Pattern和Matcher 2 Pattern类 Pattern类的概念 正则表达式经过编译后所得到的模板 九 Pattern和Matcher Pattern类的声明 publicfinalclassPatternextendsObjectimplementsSerializable 九 Pattern和Matcher Pattern类的属性 Pattern类具有8个静态属性 也称为Pattern标记 用以调整匹配的行为 九 Pattern和Matcher Pattern类的方法 Pattern类具有10个方法 九 Pattern和Matcher 1 publicstaticPatterncompile Stringregex Compilesthegivenregularexpressionintoapattern 对给定的正则表达式进行编译并赋给Pattern类2 publicstaticPatterncompile Stringregex intflags 同上 但增加flag参数的指定 3 publicMatchermatcher CharSequenceinput Createsamatcherthatwillmatchthegiveninputagainstthispattern 创建匹配器 即创建一个Matcher对象该匹配器将用来匹配参数中的输入子串 4 publicstaticbooleanmatches Stringregex CharSequenceinput 编译给定的正则表达式并且对输入子串以该正则表达式为模板开展匹配 该方法适合于该正则表达式只会使用一次的情况 也就是只进行一次匹配工作 因为这种情况下并不需要生成一个Matcher实例 5 String split CharSequenceinput 将目标字符串按照Pattern里所包含的正则表达式为模板进行分割6 String split CharSequenceinput intlimit 作用同上 增加参数limit目的在于指定分割段数 归纳 通过Pattern类 我们能够构造出功能更为强大的正则表达式对象 操作步骤 九 Pattern和Matcher 1 首先导入包 java util regex2 利用Ppile 方法编译你的正则表达式 它将根据你的String类型的正则表达式生成一个Pattern对象3 最后 将你想要检索的字符串传入Pattern对象的matcher 方法 该方法生成一个Matcher对象 它具有很多功能 典例分析 参见P300 九 Pattern和Matcher 3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中考化学重点题型专项训练
- 纤维复合材料力学性能测试系统-洞察及研究
- 供应链库存管理智能化方案
- 海洋浮游生物在深海环境中的季节性分布-洞察及研究
- 人工智能岗位职业安全-洞察及研究
- 建筑节能改造方案设计报告
- 电子商务法律风险及防范措施指南
- 家具行业质量检验标准一览
- 分布式编译器性能评估方法-洞察及研究
- 空间信息后序处理技术-洞察及研究
- 2025广西公需科目真题续集(附答案)
- T/CECS 10214-2022钢面镁质复合风管
- 学校“1530”安全教育记录表(2024年秋季全学期)
- 公路工程标准施工招标文件(2018年版)
- DL∕T 5776-2018 水平定向钻敷设电力管线技术规定
- (正式版)SH∕T 3548-2024 石油化工涂料防腐蚀工程施工及验收规范
- 道路、桥梁、隧道、地铁施工标准化手册(专业篇)
- 第十四章 环合反应天津大学
- 有机化学汪小兰 知识点总结 315化学
- 水土保持工程概(估)算编制规定(水利部水总[2003]67号)
- 串谐说明书概要
评论
0/150
提交评论