常见的字符串处理方法

通常处理字符串时,都会和其他的数据类型扯上关系,最常见的就是和数组的转化,在https://blog.csdn.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.csdn.net/qq_36923376/article/details/88900970