当前位置:首页 >> 小学教育 >>

java中字符串和正则表达式


第6章字符串和正则表达式 ?本章导读 ?String类 ?StringBuffer类 ?StringTokenizer类 ?正则表达式与字符串的替换和分解 ?Scanner类 ?模式匹配
2012-7-24 1

6.1 String类
Java使用java.lang包中的String类来创建一个 字符串变量,因此字符串变量是类类型变量,

是一 个对象。

2012-7-24

2

1. 创建字符串对象
◆ 使用String类的构造方法创建字符串对象,例如:
String s; s=new String("we are students");

◆声明和创建可用一步完成:
String s=new String("we are students");

◆也可以用一个已创建的字符串创建另一个字符串,如:
String tom=String(s);

String类还有两个较常用的构造方法: (1)String (char a[]) 用一个字符数组a 创建一个字符串对象,如
char a[]={'b', 'o', 'y'}; String s=new String(a); (2) String(char a[],int startIndex,int count)

提取字符数组a中的一部分字 符创建一个字符串对象,参数startIndex和count分别指定在a中提取字符的起 始位置和从该位置开始截取的字符个数,如
char a[]={'s', ' t ', 'b', 'u', 's', 'n' }; String s=new String(a,2,3);
3

2012-7-24

2.引用字符串常量对象
字符串常量是对象,因此可以把字符串常量的引用赋值给一个 字符串变量,如
string s1,s2; s1="How are you"; s2="How are you";

这样,s1和s2具有相同的引用,因而具有相同的实体。s1和s2 的内存示意如图6.1所示。

2012-7-24

4

3. String 类的常用方法(1)
(1)public int length() 获取一个字符串的长度
String s= "we are students",tom= "我们是学生"; int n1,n2; n1=s.length(); n2=tom.length();

那么,n1的值是15,n2的值是5。 字符串常量也可调用length()获得自身长度,如"你的爱好".length() 的值是4。
(2)public boolean equals(String s)

比较当前字符串对象的实体是否与参数指定的字符串s的实体相同.
String tom=new String( "we are students"); String jerry= new String("we are students");

tom.equals(jerry)的值是true (tom==jerry的值是false)。内存示意如图6.2
相近的方法:public boolean equalsIgnoreCase(String s) (3)public boolean contains(String s)

断当前字符串对象是否含有参数指定的字符串s 例6-1说明了方法equals()和contains()的用法(效果如图6.3所示)。
2012-7-24 5

内存示意如图6.2

2012-7-24

6

3. String 类的常用方法(2)

(4) public boolean startsWith(String s)、public boolean endsWith(String s) 判断当前字符串对象的前缀、后缀是否是参数指定的字符串s,如 String tom= "220302620629021",jerry= "21079670924022"; tom.startsWith("220") 的 值 是 true,jerry.startsWith("220") 的 值 是 false。 tom.endsWith("021") 的 值 是 true,jerry.endsWith("021") 的 值 是 false。 (5)public int compareTo(String s)

按字典序与参数s指定的字符串比较大小。如
String str= "abcde"; str.compareTo("boy")小于0,str.compareTo("aba")大于0, str.compareTo("abcde")等于0。 相近的方法:public int compareToIgnoreCase(String s)该方法忽略大小写

2012-7-24

7

3. String 类的常用方法(3)
(6)public int indexOf (String s) 从当前字符串的头开始检索字符串s,并返回首次出现s的位置。如果没有检索到字 符串s,该方法返回的值是-1。 indexOf(String s ,int startpoint) 从当前字符串的startpoint位置处开始检索 字符串s,并返回首次出现s的位置。如果没有检索到字符串s,该方法返回的值是-1。 lastIndexOf (String s) 从当前字符串的头开始检索字符串s,并返回最后出现s 的位置.如果没有检索到字符串s,该方法返回的值是-1。如 String tom="I am a good cat"; tom.indexOf("a"); //值是2 tom.indexOf("good",2); //值是7 tom.indexOf("a",7); //值是13 tom.indexOf("w",2); //值是-1 (7)public String substring(int startpoint) 获得一个当前字符串的子串,该子串是从当前字符串的startpoint处截取到最后所得 到的字符串。 substring(int start ,int end) 获得一个当前字符串的子串,该子串是从当前字 符串的start处截取到end处所得到的字符串,但不包括end处所对应的字符。如 String tom="I love tom"; String s=tom.substring(2,5); 则s为“lov”。 (8)public String trim() 字符串对象s调用该方法得到一个字符串对象,该字符串对象是s去掉前后空格后的字 8 符串。 2012-7-24

4.字符串与基本数据的相互转化
java.lang包中的Integer类调用其类方法:
public static int parseInt(String s) 将“数字”格式的字符串,如“12387”,转化为int型数据。

类似地,使用java.lang包中的Byte、Short、Long、Float、Double类调相应的类方 法:
public public public public public static byte parseByte(String s) static short parseShort(String s) static long parseLong(String s) static double parseDouble(String s) static double parseDouble(String s)

可以将“数字”格式的字符串,转化为相应的基本数据类型。

使用Long类中的下列类方法可得到整数的各种进制的字符串表示:
public public public public static static static static String String String String toBinaryString(long i) toOctalString(long i) toHexString(long i) toString(long i,int p)

其中的toString(long i, int p)返回整数i的p进制表示 例6-2 求若干个数的平均数,若干个数从键盘输入(效果如图6.4所示)。
9

2012-7-24

例子6-2 效果图

有时,我们需要将数字转化为字符串,可以使用String 类的下列类方法:
public public public public public String String String String String valueOf(byte n) valueOf(int n) valueOf(long n) valueOf(float n) valueOf(double n)

形如123、1232.98的数值转化为字符串,如
String str=String.valueOf(12313.9876); float x=123.987f; String temp=String.valueOf(x);
2012-7-24

10

5.对象的字符串表示
所有的类都默认是java.lang包中Object类的子类或间接子类。 Object类有一个public方法public String toString(),一个对象通过调 用该方法可以获得该对象的字符串表示。 一个类可以通过重写 public String toString()方法,以便获得该类 对象想要的字符串表示 ,比如 java.util包中的 Date 类就重写了 public String toString(),使得Date对象调用toString()得到的字符串是 由日期信息组成的字符序列。 如果一个类没有重写public String toString()方法,那么该类所创建 的对象调用toString()方法得到的字符串格式为:
类名@对象的引用

例6-3中的Student类重写了toString()方法、TV类没有重写 toString()方法.

2012-7-24

11

6.字符串与字符数组、字节数组
(1)字符串与字符数组 类的构造方法String(char[])和String(char[],int offset,int length)分别 用数组a中的全部字符和部分字符创建字符串对象。 String类也提供了将字符串存放到数组中的方法: public void getChars(int start,int end,char c[],int offset ) 字符串调用getChars()方法将当前字符串中的一部分字符复制到参数c指 定的数组中,将字符串中从位置start到end-1位置上的字符复制的数组c中, 并从数组c的offset处开始存放这些字符。 String类还提供了一个方法 public char[] toCharArray() 字符串对象调用该方法可以初始化一个字符数组,该数组的长度与字符 串的长度相等,并将字符串对象的全部字符复制到该数组中。 例6-4将用户在键盘输入的字符串加密,然后输出密文,见效果图。 (2)字符串与字节数组 String类的构造方法String(byte[])用指定的字节数组构造一个字符串对象。 构造方法String(byte[],int offset,int length)用指定的字节数组的一部分, 即从数组起始位置offset开始取length个字节构造一个字符串对象。方法 public byte[] getBytes()使用平台默认的字符编码,将当前字符串转化为一个 字节数组。例6-5使用了字节数组,见效果图。
2012-7-24 12

例子6-4 ,例子6-5效果图

例子6-4效果图

例子6-5效果图

2012-7-24

13

6.2 StringBuffer 类
前面我们学习了String字符串对象,String类创建的字符串对象是不可修 改的。也就是说,String字符串不能修改、删除或替换字符串中的某个字符,即 String对象一旦创建,实体是不可以再发生变化的(如图6.5所示). 本节将介绍StringBuffer类,该类能创建可修改的字符串序列,即该类的对象 的实体的内存空间可以自动的改变大小,便于存放一个可变的字符串。一个 StringBuffer对象调用append()方法可以追加字符串序列,如 StringBuffer s=new StringBuffer("I love this game"); s.append("ok");对象s调用append() 追加一个字符串序列,如图6.6所示。

2012-7-24

14

1.StringBuffer类的构造方法
StringBuffer 类 有 3 个 构 造 方 法 : StringBuffer(),StringBuffer(int size) 和
StringBuffer(String s)。 ◆构造方法 StringBuffer() 创建一个StringBuffer对象,分配给该对象的实体的

初始容量可以容纳16个字符,当该对象的实体存放的字符序列的长度大于16时, 实体的容量自动增加,以便存放所增加的字符。StringBuffer对象可以通过方法 length()获取实体中存放的字符序列的长度,通过方法 capacity()获取当前实体的 实际容量。

◆构造方法StringBuffer(int size)创建一个StringBuffer对象,可以指定分配给该对 象的实体的初始容量为参数size 指定的字符个数。当该对象的实体存放的字符 序列的长度大于size 个字符时,实体的容量自动增加,以便存放所增加的字符。 ◆构造方法 StringBuffer(String s) 创建一个StringBuffer对象,可以指定分配给 该对象的实体的初始容量为参数字符串s的长度额外再加16个字符。

2012-7-24

15

2.StringBuffer类的常用方法
①append() 将其他Java类型数据转化为字符串后,再追加到StringBuffer对象中。 ②char charAt(int n) 得到参数n指定的置上的单个字符。 注:当前对象实体中的字符串序列的第一个位置为0,第二个位置为1,以此类推。n的值 必须是非负的,并且小于当前对象实体中字符串序列的长度。 ③void setCharAt (int n, char ch) 将当前StringBuffer对象实体中的字符串位置 n处的字符用参数ch指定的字符替换。 ④StringBuffer insert(int index, String str) 将一个字符串插入另一个字符串 中,并返回当前对象的引用。 ⑤public StringBuffer reverse()将对象实体中的字符翻转,并返回当前对象的引用。 ⑥ StringBuffer delete(int startIndex, int endIndex) 从当前StringBuffer对 象实体中的字符串中删除一个子字符串,并返回当前对象的引用。这里,startIndex指 定了需删除的第一个字符的下标,而endIndex指定了需删除的最后一个字符的下一个字 符的下标。 ⑦ StringBuffer replace( int startIndex ,int endIndex, String str) 将当前 StringBuffer对象实体中的字符串的一个子字符串用参数str指定的字符串替换。被替 换的子字符串由下标startIndex和endIndex指定,即从startIndex到endIndex-1的字符 串被替换。该方法返回当前StringBuffer对象的应用。 【例6-6】

2012-7-24

16

6.3 StringTokenizer 类
分析一个字符串并将字符串分解成可被独立使用的单词时,可以使用 java.util包中的StringTokenizer类,该类有两个常用的构造方法:
① StringTokenizer(String s) 为字符串s构造一个分析器,使用默认的分隔标记,
即空格符(若干个空格被看成一个空格)、换行符、回车符、Tab符等。

② StringTokenizer(String s,String delim)

为字符串s构造一个分析器,参数 ", ; ");

dilim中的字符的任意排列组合都是分隔标记,如 StringTokenizer fenxi=new StringTokenizer("We,are; student",

把一个StringTokenizer对象称为一个字符串分析器,字符串分析器封装着语言 符号和对其进行操作的方法。一个分析器可以使用nextToken()方法逐个获取字 符串分析器中的语言符号(单词),每获取到一个语言符号,字符串分析器中 的负责计数的变量的值就自动减一,该计数变量的初始值等于字符串中的单词 数目,字符串分析器调用countTokens()方法可以得到计数变量的值。 字符串分析器通常用while循环来逐个获取语言符号,为了控制循环,我们 可以使用StringTokenizer类中的hasMoreTokens()方法,只要计数的变量的值大 于0,该方法就返回true,否则返回false。 【例6-7】是一个应用程序,用户从键盘输入一个浮点数,程序分别输出 该数的整数部分和小数部分(效果如图6.7所示)。
2012-7-24 17

例子6-7效果图

2012-7-24

18

6.4 正则表达式与模式匹配 1.正则表达式

一个正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称 作正则表达式中的元字符。例如,“\\dcat”中的\\d就是有特殊意义的元字符, 代表0到9中的任何一个。字符串0cat,1cat,2cat?9cat都是和正则表达式 \\dcat匹配字符串。 字符串对象调用 public boolean matches(String regex)方法可以判断当 前字符串对象是否和参数regex指定的正则表达式匹配。 表6.1列出了常用的元字符及其意义。Page114 表6.2给出了常用的限定修饰符的用法。 Page115
【例6-8】程序判断用户从键盘输入的字符序列是否全部由英文字母所组成。效果如 图6.8所示.

2012-7-24

19

表6.1

2012-7-24

20

表6.2

2012-7-24

21

2.字符串的替换
JDK1.4之后,字符串对象调用:
public String replaceAll(String regex,String replacement)

方法返回一个字符串,该字符串是当前字符串中所有和参数regex指 定的正则表达式匹配的子字符串被参数replacement指定的字符串替换 后的字符串,例如:
String result="12hello567".replaceAll("[a-zA-Z]+","你好");

那么result就是:
"12你好567"。

注:当前字符串调用replaceAll()方法返回一个字符串,但不改 变当前字符串。
例6-9中,字符串调用replaceAll()方法剔除字符串中的网站链接 地址(将网站链接地址替换为不含任何字符的字符串,即替换为""), 运行效果如图6.9 .
2012-7-24 22

3.字符串的分解
JDK1.4之后,String 类提供了一个实用的方法: public String[] split(String regex) 字符串调用该方法时,使用参数指定的正则表达式 regex做为分隔标记分解出其中的单词,并将分解出的 单词存放在字符串数组中。例如,对于字符串: str="1945年08月15日是抗日战争胜利纪念日!"; 如果准备分解出全部由数字字符组成的单词,就必须 用非数字字符串作为分隔标记,因此,可以使用正则 表达式: String regex="\\D+"; 作为分隔标记分解出str中的单词: String digitWord[]=str.split(regex); 那么,digitWord[0]、digitWord[1]和digitWord[2]就分 别是"1945"、"08"和"15"。 下面的例6-10中,用户从键盘输入一行文本,程序输出其 中的单词,效果如图6.10. 23

2012-7-24

6.5 Scanner类 Scanner类不仅可以创建出用于读取用户从键盘输入的数据 的对象,而且也可以创建出用于解析字符串的对象。 当需要Scanner类的对象解析字符串str时,可以如下构造一 个Scanner类的对象scanner:
Scanner scanner=new Scanner(str);

2012-7-24

24

1.使用默认分隔标记解析字符串
创建Scanner对象,并将要解析的字符串传递给所构造的对象,例如,对于 字符串:String NBA = "I Love This Game"; 为了解析出NBA中的单词,可以构造一个Scanner对象: Scanner scanner = new Scanner(NBA); 那么scanner将空白作为分隔标记,调用next()方法依次返回NBA中的单词, 如 果NBA 最 后一 个 单词 已被 next() 方法 返回 ,scanner 调用hasNext()将 返回 false,否则返回true。 对于数字型的单词,如618,168.98等可以用nextInt()或nextDouble()方 法来代替next()方法,即scanner可以调用nextInt()或nextDouble()方法将数 字型单词转化为int型或double型数据返回. 注意,如果单词不是数字型单词,调用nextInt()或nextDouble()方法将发 生InputMismatchException异常,在处理异常时可以调用next()方法返回该非 数字化单词。 例6-11中,使用Scanner对象解析出字符串"TV cost 876 dollar,Computer cost 2398 dollar "中的全部价格数字(价格数字的前后需有空格),并计算 了总消费。程序运行效果如图6.11所示。
2012-7-24 25

例子6-11效果图

2012-7-24

26

2.使用正则表达式作为分隔标记解析字符串
Scanner对象可以调用
useDelimiter(正则表达式);

方法将一个正则表达式作为分隔标记,即和正则表达式匹配 的字符串都是分隔标记。 例6-12使用正则表达式(匹配所有非数字字符串):
String regex="[^0123456789.]+";

作为分隔标记解析字符串"市话费:176.89元,长途费:187.98 元,网络费:928.66元"中的全部价格数字,并计算了总的通信费 用。程序运行效果如图6.12。
对于上述例6-12中提到的字符串,如果用非数字字符串作分隔标记,那么所 有的价格数字就是单词。

2012-7-24

27

6.6 模式匹配
模式匹配就是检索和指定模式匹配的字符串。Java提供了专 门 用 来 进 行 模 式 匹 配 的 Pattern 类 和 Match 类 , 这 些 类 在 java.util.regex包中。 以下结合具体问题来讲解使用Pattern类和Match类的步骤。 假设有字符串:
String input = "Have 7 monkeys on the tree, walk 2 monkeys, still leave how many monkeys?"

我们想知道input从哪个位置开始至哪个位置结束曾出现了 字符串monkeys。 使用Pattern类和Match类检索字符串str中的子字符串的步骤 如下:

2012-7-24

28

1.模式对象
使用正则表达式regex做参数得到一个称为模式的Pattern类的实例pattern:
Pattern pattern = Pattern.compile(regex);

例如:
String regex = "monkeys"; pattern = Pattern.compile(regex);

模式对象是对正则表达式的封装。 如 果 参 数 regex 指 定 的 正 则 表 达 式 有 错 , complie 方 法 将 抛 出 异 常 : PatternSyntaxException。Pattern类也可以调用类方法compile(String regex, int flags) 返回一个Pattern对象,参数flags可以取下列有效值: Pattern.CASE_INSENSITIVE Pattern.MULTILINE Pattern.DOTALL Pattern.UNICODE_CASE Pattern.CANON_EQ 例如,flags取值Pattern .CASE_INSENSITIVE,模式匹配时将忽略大小写。
2012-7-24 29

2. 匹配对象

2012-7-24

得到可以检索字符串input的Matcher类的实例matcher(称为匹配对象): Matcher matcher = pattern.matcher(input); 模式对象pattern调用matcher(CharSequence input)方法返回一个Matcher对象matcher, 称为匹配对象,参数input用于给出matcher要检索的字符串参数input可以是任何一个实 现了CharSequence接口的类创建的对象。 Matcher对象matcher可以使用下列方法寻找字符串input中是否有和模式regex匹配 的子序列。 * public boolean find():寻找input和regex匹配的下一子序列,如果成功该方法返 回true,否则返回false。 *public boolean matches():判断input是否完全和regex匹配。 *public boolean lookingAt():判断从input的开始位置是否有和regex匹配的子序列。 * public boolean find(int start) 判断input从参数start指定位置开始是否有和 regex匹配的子序列,参数start取值0时,该方法和lookingAt()的功能相同。 * public String replaceAll(String replacement) 返回一个字符串,该字符串是通 过把input中与模式regex匹配的子字符串全部替换为参数replacement指定的字符串得 到的。 * public String replaceFirst(String replacement) 返回一个字符串,该字符串是 通过把input中第1个与模式regex匹配的子字符串替换为参数replacement指定的字符串 得到的。 例6-13查找一个字符串中全部的单词monkeys以及该单词的在字符串中的位置(位 置索引从0开始)。程序运行效果如图6.13。 例6-14使用模式匹配查找一个字符串中的网址,然后将网址串全部剔除得到一个新 字符串,运行效果如图6.14。 30

例子6-13,例子6-14效果图

2012-7-24

31

3. 模式的逻辑或
模式可以使用位运算符“|”进行逻辑“或”运算得到一个新模式。例如, pattern1和pattern2是两个模式,即两个正则表达式。那么,
pattern=pattern1|pattern2

就是两个模式的“或”。 一个字符串如果匹配模式pattren1或匹配模式pattern2,那么就匹配模式 pattern。 。 例6-15模式的逻辑或. 上述程序的运行结果如下: 从0到7匹配模式子序列:loveyou 从7到13匹配模式子序列:hateme 从13到20匹配模式子序列:love123 从23到29匹配模式子序列:hate99 从30到37匹配模式子序列:love888
32

2012-7-24

2012-7-24

33


相关文章:
Java中正则表达式的一个简单例子
Java 中正则表达式的一个简单例子 本文由广州疯狂软件 java 培训分享: import ...} } } 在程序开发中, 难免会遇到需要匹配、 查找、 替换、 判断字符串的情况...
Java正则表达式的总结和一些小例子
Java 正则表达式的总结和一些小例子文章分类: 文章分类:Java 编程 字符串处理是许多程序中非常重要的一部分,它们可以用于文本显示,数据表示, 查找键和很多目的.在 ...
java中使用正则表达式
例如, 正则表达式"java" 中没有包含任何元字符,它可以匹配"java"和"javascript"等字符串,但是不能匹配"Java"。 1.2.1 正则表达式语法要想学会正则表达式,理解...
字符串和正则表达式习题
字符串和正则表达式习题_工学_高等教育_教育专区。字符串和正则表达式习题 1 2.模板代码 . StringExample.java class StringExample { public static void main(...
10个你应该知道的Java正则表达式的例子
10个你应该知道的Java正则表达式的例子_IT/计算机_专业资料。10个你应该知道的 ...[_A-Za-z0-9-]+ # 接下来是一个点"."和中括号内的字符[],必须包含 ...
Java正则表达式的使用
Java正则表达式的使用_互联网_IT/计算机_专业资料。java正则表达式的使用规则,常用...将字符串转换成字符数组在一一进行比较,如果没有出现非数字字 符,则其是由...
JAVA中使用正则表达式的若干方法
被查找的字符串:str 2、要查找的关键字(或正则表达式):keywordPattern 情况一:判断 str 里是否含有 keywordPattern 情况一: 1 import java.util.regex.Matcher; ...
java 正则表达式pattern类Matcher类 (字符串匹配)
java 正则表达式pattern类Matcher类 (字符串匹配)_IT/计算机_专业资料。java ..."或者若干 个空格匹配 split 方法使用正则匹配将字符串切割成各子串并且返回 ...
Java正则表达式教程及示范代码
Java正则表达式教程及示范代码_计算机软件及应用_IT/计算机_专业资料。Java正则表达式教程及示范代码Java 正则表达式教程及示范代码正则表达式用来指定字符串模式。 当你...
Java中正则表达式使用方法详解
Java 中正则表达式使用方法详解(二) Jakarta-ORO 库以前叫做 OROMatcher,Daniel ...▲ PatternMatcher 对象 PatternMatcher 对象根据 Pattern 对象和字符串进行匹配...
更多相关标签:
java字符串正则表达式 | 正则表达式字符串中间 | 正则表达式匹配字符串 | 正则表达式替换字符串 | 正则表达式截取字符串 | 正则表达式提取字符串 | 正则表达式包含字符串 | 正则表达式查找字符串 |