常见的字符串处理方法
通常处理字符串时,都会和其他的数据类型扯上关系,最常见的就是和数组的转化,在https://blog.****.net/qq_36923376/article/details/84635247这篇博文中已经讲过一些,这里做下补充。
一、字符串与字符数组
字符数组转化为字符串
使用String的构造方法:
- String(char a[]);
- String(char a[] ,int offset,int length);
字符串转化为字符数组
- public void getChars(int start, int end,char c[],int offset): 将当前字符串的一部分字符复制到参数c指定的数组中。将字符串中从位置start到end-1位置的字符复制到数组c中,且从数组c的offset处开始存放这些字符。
- public char[] toCharArray() :将字符串中的全部字符存放在一个字符数组中。
二、字符串与字节数组
字节数组转化为字符串
使用String的构造方法:
- String(byte[] bytes);
- String(byte[] bytes,int offset,int length):从数组起始位置offset开始取length个字节构造一个字符对象
字符串转化为字节数组
- public byte[] getBytes() :方法使用平台默认的字符编码,将当前字符串转化为一个字节数组
- public byte[] getBytes(String charsetName):使用参数指定字符编码,将当前字符串转化为一个字节数组
注意:如果平台默认的字符编码是GB2312,那么调用getBytes()方法等同于调用getBytes("GB2312"),但需要注意的是,带参数的getBytes(String charsetName)抛出UnsupportedEncodingException异常,因此,必须在try-catch语句中此方法。
三、正则表达式及字符串的替换与分解
1.正则表达式
一个正则表达式含有一些具有特殊意义字符的字符串
2.字符串的替换
字符串对象调用public String replaceAll(String regex,String replacement):将符合regex正则表达式的字符串用replacement字符串替换,如:
String s="12hello345world".replaceAll("[a-zA-Z]+","哈哈");//12哈哈345哈哈
注:当前字符串调用replaceAll()方法返回一个字符串,但不改变当前字符串。
3.字符串的分解
- 方法一:public String[] split(String regex)
字符串调用该方法,使用参数指定的正则表达式regex作为分隔标记分解其中的字符串,并将字符串存放在字符串数组中。
public class Main{
public static void main(String args[]){
String str = "123i45like78apples9.";
String regex = "[0123456789]+";
String s[] = str.split(regex);
for(String a:s)
System.out.print(a+" ");
}
}
//输出: i like apples .
- 方法二:使用java.util包中的StringTokenizer类
构造方法:
1)StringToken(String s)
为字符串s构造一个分析器。使用默认的分隔标记,即空格符(多个空格也算一个)、换行符、回车符、Tab符、进纸符 做分隔标记。
2)StringTokenizer(String s,String delim)
为字符串s构造一个分析器。参数delim中的字符被作为分隔标记。称一个StringTokenizer对象为字符串分析器,一个分析 器可以使用nextToken()方法逐个获取字符串中的语言符号,每当调用nextToken()时,都将在字符串中获得下一个语言符 号,字符串分析器中负责计数的变量的值就自动减1,该计数变量的初始值等于字符串中单词数目。
通常用while循环来逐个获取语言符号,为了控制循环,可以使用StringTokenier类中的hasMoreTokens()方法,只要字符 串中还有语言符号,即计数变量的值大于0,该方法就返回true,否则返回false。另外还可以随时让分析器调用 countTokens()方法得到分析器中计数变量的值。
import java.util.StringTokenizer;
public class Main{
public static void main(String args[]){
String str = "123i45like78apples9.";
StringTokenizer token = new StringTokenizer(str,"0123456789");
System.out.println(token.countTokens());
while(token.hasMoreTokens()) {
System.out.println(token.nextToken());
}
System.out.println(token.countTokens());
}
}
输出:
4
i
like
apples
.
0
- 方法三:使用Scanner类解析字符串
1)使用默认分隔标记解析字符串
String a = " i like apples";
Scanner scanner = new Scanner(a);
a).那么将以空格作为分隔标记来解析字符串中的单词,scanner调用next()方法依次返回a中的单词,如果a最后一个单词已被next()方法返回,scanner调用hasNext()将返回false,否则返回true。
b)对于被解析的字符串中的数字型单词,scanner可以用nextInt()、nextDouble()等方法来代替next()方法,即scanner可以调用nextInt()或nextDouble()方法将数字型单词转化为int或double数据返回。
c).如果单词不是数字型单词,scanner调用nextInt()或nextDouble()方法将发生InputMismatchException异常,在处理时可以调用next()方法返回非数字化单词。
d).scanner.useDelimiter(正则表达式);如果加上此句则会根据正则表达式进行解析。
import java.util.InputMismatchException;
import java.util.Scanner;
public class Main{
public static void main(String args[]){
String str = "123i45like78apples9.";
Scanner scanner = new Scanner(str);
scanner.useDelimiter("[a-z.]+");
try {
while(scanner.hasNext()) {
System.out.println(scanner.nextInt());
}
}
catch(InputMismatchException e){
System.out.println(e);
}
}
}
输出:
123
45
78
9
在i/o中,同样可以使用此方法来解析文件,这里以txt文件为例。
前言:一般应用程序可能需要解析文件中的特殊数据。一般分为两种解析思路
- 把文件内容全部读入内存,再进行解析,其优点是处理速度快,但会消耗较多内存,即牺牲空间换取时间
- 直接解析文件,之后再读入内存,以时间换取空间,其优点是消耗内存少,但解析的速度相对较慢
下面将使用Scanner直接解析文件
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Main{
public static void main(String args[]){
File file = new File("F:","aaa.txt");
Scanner sc;
try {
sc = new Scanner(file);
sc.useDelimiter("[a-z.]+");
while(sc.hasNext()) {
System.out.println(sc.nextInt());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
//txt文件在F盘,内容是123i45like78apples90.
四、关于Pattern与Matcher类解析字符串
https://blog.****.net/qq_36923376/article/details/88900970