Java学习笔记(字符串和正则表达式)

  • String类
  • 1.创建字符串对象
  • 2.引用字符串对象
  • 3.String类的常用方法
  • (1)public int length()
  • (2)public boolean equals(String s)
  • (3)public boolean contains(String s)
  • (4)public boolean startWith(String s)和public boolean endWith(String s)
  • (5)public int compareTo(String s)
  • (6)public int indexOf(String s)
  • (7)public String substring(int startpoint)
  • (8)public String trim()
  • 4.字符串与基本数据的相互转化
  • 5.对象的字符串表示
  • 6.字符串与字符数组、字节数组
  • (1)字符串与字符数组
  • (2)字符串与字节数组
  • StringBuffer类
  • 1.StringBuffer类的构造方法
  • 2.StringBuffer类的常用方法
  • StringTokenizer类
  • 正则表达式级字符串的替换与分解
  • 1.正则表达式
  • 2.字符串的替换
  • 3.字符串的分解
  • Scanner类
  • 使用默认分割符解析字符串
  • 2.使用正则表达式作为分隔标记解析字符串
  • 模式匹配
  • 1.模式对象
  • 2.匹配对象
  • 3.模式的逻辑或


String类

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

1.创建字符串对象

String类可以创建字符串对象,如

String s;
s=new String(" we are students")

String s=new String(" we are students")

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','u','d','e','n','t'};
String s=new String(a,,2,3);

2.引用字符串对象

字符串常量是对象,因此可以把字符串常量引用赋值给一个字符串变量,如

string s1,s2;
s1="how are you ";
s2="how are you";

此时s1,s2具有相同的引用。

3.String类的常用方法

(1)public int length()

String类中的length方法可以获取一个字符串的长度。

String s="we are studens";
int n1;
ni=s.length();
(2)public boolean equals(String s)

字符串对象调用equals方法,比较当前字符串实体是否与指定字符串s实体相同,如:

String a=new String("we are students");
String b=new String("We are students");
String c=new String("we are students");

a.equals(b)是false,a.equals©是true,a==b是false因为a,b,c都是引用字符串调用public boolean equalsIgnoreCase(String s)比较当前字符串对象与参数指定的字符串s是否相同,比较时忽略大小写。

(3)public boolean contains(String s)

字符串调用contains()方法,判断当前指定的字符串是否含有参数指定的字符串s。

(4)public boolean startWith(String s)和public boolean endWith(String s)

字符串对象调用startWith(String s)方法,判断当前字符串对象的前缀是否是参数指定的字符串s,方法endWith(String s)判断一个字符串的后缀是否是字符串s。如

String a="220302620629021";

a.startWith(“220”);是true,a.endWith(“0212”);是false。

(5)public int compareTo(String s)

字符串对象可以使用compareTo,按字典序与参数s指定的字符串比较大小。如果当前字符串与s相同该方法的返回值是0;如果当前字符串大于s该方法返回正值,如果小于s该方法返回负值。

(6)public int indexOf(String s)

字符串调用方法indexOf(String s)方法,从当前字符串的头开始检索字符串s,并返回首次出现s的位置。如果没有检索到s,则返回-1。
字符串调用indexOf(String s,int startpoint)从当前字符串的startpoint位置开始检索字符串s,并返回首次出现s的位置,如果没有检索到s则返回-1。
字符串调用方法lastIndexOf(String s),从当前字符串的头开始检索字符串s。并返回最后出现s的位置,如果没有检索到s,则返回-1。

(7)public String substring(int startpoint)

字符串对象调用该对象获得一个当前字符串的子串,该子串是从当前字符串的startpoint出截取到最后的所得到的字符串。
字符串调用该方法public String substring(int start,int end),获得当前字符串的一个子串,该子串是从当前字符串的start处截取到end的一个子串,但不包括end的一个子符。

(8)public String trim()

一个字符串s通过调用trim方法的刀一个字符串对象,该字符对象是s去掉前后空格后的字符串。

4.字符串与基本数据的相互转化

java.lang包中的Integer类调用其类方法如下:

public static int parseInt(String s)

可以将数字格式的字符串转化为int类型数据,如:

int x;
String s="123";
x=Integer.parseInt(s);

类似的,使用java.lang包中的Byte、Short、Long、Float、Double类调用类似的类方法:

public static byte parseByte(String s)
public static short parseShort(String s)
public static long parseLong(String s)
public static float parseFloat(String s)
public static double parseDpuble(String s)

可以将数字格式字符串转化为对应的基本数据类型。
使用Long类中的类方法可以得到整数的各种进制的字符串表示:

public static String tostring(long i,int p)

返回整数i的p进制表示。
需要将数字转化为字符串可以使用String类的的下列static方法:

public static String valueOf(byte n)
public static String valueOf(int n)
public static String valueOf(long n)
public static String valueOf(float n)
public static String valueOf(double n)

5.对象的字符串表示

所有的类都默认是java.lang包中Object类的子类或间接子类,Object类有一个public方法public static toString (),一个对象通过调用该方法,可以获得该对象的字符串表示。一个类可以通过重写,该方法获得该对象想要的字符串表示。如果一个类没有重写public static toString()方法,那么该类所创建的对象调用toString()方法得到的字符串格式为:

类名@对象的引用

java 字符串 英文 java字符串表达式_后端


java 字符串 英文 java字符串表达式_java_02


java 字符串 英文 java字符串表达式_开发语言_03

6.字符串与字符数组、字节数组

(1)字符串与字符数组

String的常用构造方法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处开始存放这些字符。注:必须保证数组c能存放下要被复制的字符。
String类还提供了一个方法:
public char[] toCharArray()
字符串中位置调用该方法可以初始化一个字符数组,该数组的长度与字符串的长度相同,并将字符串对象的群不字符复制到该数组中。

(2)字符串与字节数组

String类的构造方法String(byte[])用指定的字节数组对象构造一个字符串对象构造方法String (byte[],int offset,int length)用制定的字节数组的一部分,即从数组起始位置offset开始取length字节构造一个字符串对象,方法public byte[],getBytes使用平台默认的字符编码,将当前字符串转化为一个字节数组。

StringBuffer类

String类创建的字符串对象时不可修改的。也就是说,String字符串不能修改、删除、替换字符串中的某个字符。即String对象一旦创建就不可以在发生变化。
StringBuffer类可以创建一个可修改的字符串序列,即该类的对象的实体内存空间可以自动改变大小,便于存放一个可变的字符串,一个StringBuffer,对象调用append()方法可以追加字符串序列。

1.StringBuffer类的构造方法

StringBuffer有是三个构造方法,StringBuffer(),StringBuffer(int size),StringBuffer(String s).
构造方法StringBuffer()创建一个StringBuffer对象,分配给对象的实体初始容量可以存放16个字符,当该对象的实体存放的字符,当该对象的实体存放的字符序列大于16时,实体容量自动增加。StringBuffer通过length()方法获取实体中存放字符序列的长度,通过方法capacity获取当前实体的容量。
构造方法StringBuffer(int size),创建一个StringBuffer对象,可以指定分配给该对象的实体的初始容量参数 size指定字符个数,当对象存放字符实体大于size时,容量自动增加。
构造方法StringBuffer(Sting s)创建一个StringBuffer对象,可以指定分配给对象实体的初始容量为字符串s的长度再加上16个字符。

2.StringBuffer类的常用方法

(1)append()
append()——将其他Java类型数据转化为字符串或再追加到StringBuffer对象中;
(2)char charAt(int n)
char charAt(int n)——得到参数n位置上的单个字符,n必须是非负的,并且n小于字符串的长度。
(3)void setCharAt(int n,char ch)
void setCharAt(int n,char ch)——将当前StringBuffer字符串对象实体中的字符串n位置字符,用参数ch字符进行替换。
(4)StringBuffer(int index,String str)
StringBuffer(int index,String str)——将一个字符串插入到另一个字符串中,并返回当前对象的引用。
(5)public StringBuffer reversese()
public StringBuffer reversese()——将当前实体对象的字符翻转,并返回当前对象的引用。
(6)StringBuffer delete(int startIndex,int endIndex)
StringBuffer delete(int startIndex,int endIndex)——从当前StringBuffer对象中删除一个子字符串,并返回当前对象的引用,startIndex指定需删除开始字符的下标,endIndex指定需删除最后一个字符的下一个字符的下标。
(7)StringBuffer replace(int startIndex,int endIndex,String str)
StringBuffer replace(int startIndex,int endIndex,String str)——将当前StringBuffer对象实体中字符串的一个子字符串用参数str替换,子字符串由startIndex和endIndex指定。

StringTokenizer类

StringTokenizer分析一个字符串,并将该字符串分解成独立的单词,该类有两个构造方法:
StringTokenizer(string s)——为字符串s构造一个分析器,使用默认分割标记例如空格、换行符等。
StringTokenizer(String s,String delim)——为字符串s构造一个分析器,参数delim中字符的任意排列组合都是分隔标记。
分析器可以使用 nextToken()方法逐渐获取其中的语言符号,没获取一个字符串语言符号,字符串分析器中负责计数的变量的值自动减一,该计数变量的初始值为当前字符串中单词数目。字符串调用countTokens()方法可以的到计数变量的值,hasMoreTokens()方法,计数变量的值大于0返回true,否则返回false。

正则表达式级字符串的替换与分解

1.正则表达式

一个正则表达式是含有一些个特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。
在正则表达式中可以用方括号扩起若干字符来表示一个字符,该元字符代表方括号中的任何一个字符。例如:

regex="[159]ABC"

方括号元字符意义如下:
[abc]:代表a、b、c中的任何一个
[^abc]:代表除了a、b、c以外的任何字符
[a-z,A-Z]:代表英文字母的任何一个
[a-d]:代表a-d中任何一个
另外在方括号中套方括号,可以进行并交差运算,例如:
[a-d[m-p]]:代表a-d或m-p任何元素(并)
[a-z&&[def]]:代表d、e、f中的任何一个(交)
[a-f&&[^bc]:代表a、d、e、e中的一个(差)

元字符

在正则表达式中的写法

意义

.

.

代表任何一个字符

\d

\\d

代表0-9任何一个数字

\D

\\D

代表人和一个非数字字符

\s

\\s

代表空格类字符

\w

\\w

代表用于表示标识符的字符(不包括美元字符)

\W

\\W

代表不能用于标识符的字符

\p{Lower}

\\p{Lower}

小写字母[a-z]

\p{Upper}

\\p{Upper}

大写字母[A-Z]

\p{ASCII}

\\p{ASCII}

ASCII字符

\p{Aipha}

\\p{AIpha}

字母

\p{Digit}

\\p{Digit}

数字字符即0-9

\p{Alnum}

\\p{Alnum}

字母或数字

\p{Punct}

\{Punct}

标点符号

\p{Graph}

\\p{Graph}

可视字符

\p{Print}

\\p{Graph}

可打印字符

\p{Blank}

\\p{Blank}

空格或制表符

\p{Cntrl}

\\p{Cntrl}

控制字符:{\x00-\x1F\x7F}

在正则表达式中可以使用限定修饰符。
常用限定修饰符的用法:

带限定符号的模式

意义

X?

X出现0次或1次

X*

X出现0次或多次

X+

X出现一次或多次

X{n}

X恰好出现n次

X{n,}

X至少出现n次

X{n,m}

X出现n到m次

XY

X后跟Y

X|Y

X或Y

2.字符串的替换

字符串对象调用public String replaceAll(String regex,String replacement)方法返回一个字符串,该字符串是当前字符串中所有与参数regex指定的正则表达式匹配的字符串被参数replacement指定的字符串替换后的字符串,例如:

String result="123hello456".replaceAll([a-zA-Z],"你好");

3.字符串的分解

String类提供了一个public String [] split(String regex),字符串调用该方法时使用参数指定的正则表达式regex作为分隔符标记分解出其中单词,并将分解出的单词存放在字符串数组中。例如:

String str="1945年8月15日" 
String regex="\\D+"
String digitWord[]=str.spilt(regex);

结果:digitWord[0]=1945,digitWord[1]=8,digitWord[2]=15,

Scanner类

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

Scanner scanner=new Scanner(str);

使用默认分割符解析字符串

创建Scanner对象,并将要解析的字符串传递给所构造的对象,为了解析NBA中的单词可以构造一个Scanner对象,例如:

String NBA="I Love This Game";
Scanner scanner=new Scanner(NBA);

那么scanner将空白作为分隔标记,调用next()方法依次返回NBA中的单词,如果NBA中最后一个单词被next()方法返回,scanner调用hasNext()方法返回false,否则返回true。

对于数字型单词,可以用nextInt()或nextDouble()方法替代next()方法,即scanner可以调用nextInt()或nextDouble()方法将数字型单词转化为int或double类型数据返回,注意如果单词不是数字型单词调用nextInt()或nextDouble()方法会出现异常。

java 字符串 英文 java字符串表达式_开发语言_04

2.使用正则表达式作为分隔标记解析字符串

Scanner可以调用useDelimiter(正则表达式)方法将一个正则表达式作为分隔标记,即正则表达式匹配的字符串都是分隔标记。

模式匹配

模式匹配就是检索和指定模式匹配的字符串,Java提供了专门来进行模式匹配的Pattern类和Match类,这些类在java.utiil.regex类中。

1.模式对象

模式对象是对正则表达式封装,Pattern类调用类方法,compile(String regex)返回一个模式对象,其中参数regex是一个正则表达式,称为模式对象使用的模式,如果参数regex指定的正则表达式有错,那么compile()方法将抛出异常PatternSyntaxException,Pattern类也可以调用类方法compile(String regex,int flags)返回一个Pattern对象,参数flag可取:Pattern.CASE_INSENSITIVE,Pattern.CASE_MULTILIN,Pattern.DOTALL,Pattern.UNICODE_CASE,Pattern.CANON_EQ.

2.匹配对象

Matcher类的实例matcher(匹配对象)可以检索字符串input。
匹配对象matcher可以调用,各种检索方法检索字符串input,Matcher可以使用下列方法寻找字符串input中是否有与模式regex匹配的子序列:
(1)public bollean find():
寻找input和regex匹配的下一个子序列,如果成功返回true如果失败返回false,matcher初次使用该方法会检索第一个与regex匹配的子序列,再次使用会在上一次匹配成功的子序列后寻找下一个匹配模式的子字符串。当find()方法返回true时,matcher可以调用start()方法和end()方法,得到该匹配模式子序列input中初始位置和结束位置。当find()方法返回true时,matcher调用group()可以返回find()方法本次找到的匹配模式的字符串。
(2)public bollean matches():
matcher调用该方法判断input是否完全与regex匹配。
(3)public boolean lookingAt():
matcher调用该方法判断从input的开始位置是否有与regex匹配的子序列。当lookingAt()方法返回true时,matcher可以调用start()方法和end()方法,得到该匹配模式子序列input中初始位置和结束位置。当find()方法返回true时,matcher调用group()可以返回lookingAt()方法本次找到的匹配模式的字符串。
(4)public boolean find(int start):
matcher调用该方法,判断input从参数start指定位置开始是否有与regex匹配的子序列,参数start=0时该方法与lookingAt()相同。
(5)public String replaceAll(String replacement):
matcher调用该方法,可以返回一个字符串,该方法时通过把input中与模式regex匹配的子字符串全部替换成参数replacement指定字符串得到的。(input本身没有变化)
(6)public String replaceFirst(String replacement):
matcher调用该方法可以返回一个字符串,该字符串时通过把input中第一个与模式regex匹配的字符串替换为参数replacement指定字符串得到的。(input本身没有变化)

3.模式的逻辑或

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