Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

3.3. String 字符串

Java 11 增加了一系列的字符串处理方法,如以下所示。

		
// 判断字符串是否为空白
" ".isBlank(); // true
// 去除首尾空格
" Javastack ".strip(); // "Javastack"
// 去除尾部空格
" Javastack ".stripTrailing(); // " Javastack"
// 去除首部空格
" Javastack ".stripLeading(); // "Javastack "
		
		

3.3.1. 查找字符重现的位置

			
package cn.netkiller.test;

public class Test {

	public static void main(String[] args) {

		String string = new String("http://www.netkiller.cn");

		System.out.println("查找字符 . 第一次出现的位置: " + string.indexOf('.'));
		System.out.println("从第15个字符位置查找字符 . 出现的位置:" + string.indexOf('.', 15));
	}
}	
			
			

3.3.2. 行数统计

			
"A\nB\nC".lines().count(); // 3			
			
			

3.3.3. 复制字符串

			
"Java".repeat(3);// "JavaJavaJava"			
			
			

3.3.4. 随机字符串

			
	public String randomString(String chars, int length) {
		Random rand = new Random();
		StringBuilder buf = new StringBuilder();
		for (int i = 0; i < length; i++) {
			buf.append(chars.charAt(rand.nextInt(chars.length())));
		}
		return buf.toString();
	}
	
	/**
     * 获取4位随机验证码
     * @return
     */
    public static String getValidationCode(){
        return String.valueOf((new Random().nextInt(8999) + 1000));
    }

    /**
     * 获取6位随机验证码
     * @return
     */
    public static String getValidationCode(){
        return String.valueOf((new Random().nextInt(899999) + 100000));
    }	
			
			
			
import java.util.Random;

public class RandomNumberGenerator {
    public static void main(String[] args) {
        Random random = new Random();
        // 生成1000到9999之间的随机整数
        int randomNumber = random.nextInt(9000) + 1000;
        System.out.println("生成的4位随机数字是:" + randomNumber);
    }
}

public class RandomNumberGenerator {
    public static void main(String[] args) {
        // 生成1000到9999之间的随机整数
        int randomNumber = (int) (Math.random() * 9000) + 1000;
        System.out.println("生成的4位随机数字是:" + randomNumber);
    }
}

import java.security.SecureRandom;

public class RandomNumberGenerator {
    public static void main(String[] args) {
        SecureRandom secureRandom = new SecureRandom();
        // 生成1000到9999之间的安全随机整数
        int randomNumber = secureRandom.nextInt(9000) + 1000;
        System.out.println("生成的4位安全随机数字是:" + randomNumber);
    }
}

import java.util.Random;
// 说明:此方法会生成一个0-9999的随机整数,然后利用String.format("%04d", number)将其格式化为长度为 4 的字符串,若数字不足 4 位,会在前面补0,例如0001、0123等。
public class RandomNumberGenerator {
    public static void main(String[] args) {
        Random random = new Random();
        // 生成0到9999之间的随机整数
        int randomNumber = random.nextInt(10000);
        // 格式化为4位字符串,不足4位时在前面补0
        String formattedNumber = String.format("%04d", randomNumber);
        System.out.println("生成的4位随机数字字符串是:" + formattedNumber);
    }
}			
			
			

3.3.5. 字符串替换处理

3.3.5.1. 替换转意字符

			
public class Test {

	public Test() {
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("2010-09-11T20:00:30".replace("T", " "));
	}
}
			
			
				
			
{"status":0,"message":"","bankcode":"ABOC;IBC;CCTB;ICBC"}
转换后
{\"status\":0,\"message\":\"\",\"bankcode\":\"ABOC;IBC;CCTB;ICBC\"}			
			
				
			
package test;

public class str {

	public static void main(String[] args) {
		String jsonString = "{\"status\":0,\"message\":\"\",\"bankcode\":\"ABOC;IBC;CCTB;ICBC\"}";
		System.out.println(jsonString);
		System.out.println(jsonString.replace("\"", "\\\""));
	}

}
			
				

3.3.5.2. replaceAll

				
package cn.netkiller.test;

public class Test {


    public static void main(String[] args) throws InterruptedException {

        System.out.println("我是小云,你是谁小策".replaceAll("小云|小策", ""));

    }
    
}				
				
				

3.3.5.3. 替换控制字符

				
str.replaceAll("\\p{Cntrl}", "");				
				
				

3.3.5.4. 正则表达式查找与替换

查找特定字符并替换为找到的内容

				
package cn.netkiller.type;

public class ragexTest {

	public ragexTest() {
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String str = "<html>Netkiller</html>";
		String regex = "<html>|</html>";
		//运行结果返回 Netkiller
		System.out.println(str.replaceAll(regex, ""));
		
		// 运行结果返回 Neo
		System.out.println("CN/NETKILLER/WWW/Neo_Chen".replaceAll(".*/(.+)_Chen", "$1"));
	}
}
				
				

3.3.5.5. 利用正则快速转换时间格式

				
// 20200303 => 2020-03-03
date = date.replace(/(.{4})/, "$1-");
date = date.replace(/(.{7})/, "$1-");				
				
				

用正则处理 Alertmanager 日期 rfc3339 格式 2021-08-23T01:30:30.2206015+08:00,Alertmanager 日期格式中有7位数的毫秒,使用 SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX") 无法正常读取。

				
package cn.netkiller.alertmanager;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.TimeZone;

public class Test {

	public Test() {
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) throws ParseException {
		// TODO Auto-generated method stub
		String rfc3339 = "2021-08-23T01:30:30.2206015+08:00";
		rfc3339 = rfc3339.replaceAll(".[0-9]{7}", "");

		System.out.println(rfc3339);
		System.out.println(rfc3339.replaceAll("([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})+(.*)", "$1年$2月$3日 $4时$5分$6秒"));
		System.out.println(rfc3339.replaceAll("([0-9]{4}-[0-9]{2}-[0-9]{2})T([0-9]{2}:[0-9]{2}:[0-9]{2})+(.+)", "日期:$1 时间:$2"));

		// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
		simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+8"));
		System.out.println(simpleDateFormat.parse(rfc3339).toString());

	}

}				
				
				
				
2021-08-23T01:30:30+08:00
2021年08月23日 01时30分30秒
日期:2021-08-23 时间:01:30:30
Mon Aug 23 01:30:30 CST 2021				
				
				

3.3.5.6. replaceAll

替换一组字符串

				
        String str1 = "广东省,福建省,北京市,海淀区,河北省,上海市";
        str1 = str1.replaceAll("(省|市|区)", "");
        System.out.println("替换多个中文:" + str1);
        
        替换多个中文:广东,福建,北京,海淀,河北,上海				
				
				

替换 Ascii

			
		String string = "佛山市123南海区ABC精密abc机械有限公司􁵪􁻠􁴹􄲀􀞜􀨨,";

		String clean = string.replaceAll("\\P{Print}", "");
		System.out.println(clean);			
			
				

3.3.5.7. 字符串处理,删除中文以外的字符

Unicode 码表 https://www.ssec.wisc.edu/~tomw/java/unicode.html

			
	String string = "2017-12-18 netkiller http://www.netkiller.cn -  网站正常";
	System.out.println(string.replaceAll("[^\u4e00-\u9fa5]", ""));			
			
				

3.3.5.8. 取出字符串中的中文字符

Unicode 码表 https://www.ssec.wisc.edu/~tomw/java/unicode.html

			
		String string = "2017-12-18 netkiller http://www.netkiller.cn -  网站正常";
		String regex = "[\u4e00-\u9fa5]";
		System.out.println(string.replaceAll(regex, ""));			
			
				

3.3.5.9. 替换行首的标点符号

				
    public static String cleansing(String text) {

        String replacement = "";
        Pattern pattern = Pattern.compile("^[\\p{P}]", Pattern.MULTILINE);
        Matcher matcher = pattern.matcher(text);
        String result = matcher.replaceAll(replacement);
        return result;
    }				
				
				

3.3.5.10. 查找替换末尾最后一个字符

				
package cn.netkiller.test;

import java.util.List;

public class Test {


    public Test() {
    }

    public static String replaceEnd(String string) {
        
        char c = string.charAt(string.length() - 1);
        if (List.of(',', ',', '、').contains(c)) {
            string = string.substring(0, string.length() - 1);
        }

        return string;
    }

    public static void main(String[] args) throws Exception {
        List.of("你好!", "你好,中国,", "Hello,", "Hello world!", "你在干啥么吗?没看到吗?", "这里真好").forEach(s -> {
            System.out.println(replaceEnd(s));
        });

    }
    
}
				
				
				
你好!
你好,中国
Hello
Hello world!
你在干啥么吗?没看到吗?
这里真好
				
				

3.3.5.11. 数字开头的字符串前面加回车符

				
        String original = "1: neo 2: netkiller 3: other";
        System.out.println(original.replaceAll("\n", "").replaceAll("(?=^\\d:|\\d:)", "\n"));
				
				
				
1: neo 
2: netkiller 
3: other
				
				

3.3.6. substring

			
例如:
String str = "helloword!!!";

System.out.println(str.substring(1,4));

System.out.println(str.substring(3,5));

System.out.println(str.substring(0,4));

将得到结果为:

ell

lo 

hell
			
			

3.3.7. string to timestamp

Timestamp转化为String:

				SimpleDateFormat df = new
				SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //定义格式,不显示毫秒
				Timestamp now =
				new Timestamp(System.currentTimeMillis());
				//获取系统当前时间
				String str =
				df.format(now);
			

String转化为Timestamp:

				SimpleDateFormat df = new
				SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				String time = df.format(new
				Date());
				Timestamp ts = Timestamp.valueOf(time);
			

3.3.8. String.strip

java11对String类新增了strip,stripLeading以及stripTrailing方法,除了strip相关的方法还新增了isBlank、lines、repeat(int)等方法

			
	@Test
    public void testStrip(){
        String text = "  \u2000a  b  ";
        Assert.assertEquals("a  b",text.strip());
        Assert.assertEquals("\u2000a  b",text.trim());
        Assert.assertEquals("a  b  ",text.stripLeading());
        Assert.assertEquals("  \u2000a  b",text.stripTrailing());
    }
			
			

3.3.9. 文本块

			
package cn.netkiller.kubernetes;

public class Test {

	public Test() {
	}

	public static void main(String[] args) {

		String json = """
				{
				"name" : "netkiller",
				"home" : "https://www.netkiller.cn/"
				}
				""";
		System.out.println(json);
	}

}			
			
			

3.3.10. 分割字符串

			
        String[] string = topic.split("/");
        Log.d("Service", string.length + "");
        for (String str: string) {
            Log.d("Service", str);
        }		
        
		String str2 = new String("www.netkiller.cn");
        for (String retval: str2.split("\\.", 3)){
            System.out.println(retval);
        }
 
        System.out.println("");
        String str3 = new String("acount=? and uu =? or n=?");
        for (String retval: str3.split("and|or")){
            System.out.println(retval);
        }                
			
			

3.3.11. String.format 字符串格式化

3.3.11.1. 前补零

				
package cn.netkiller.test;

import lombok.Data;

import java.io.IOException;

@Data
public class Test {
    public static void main(String[] args) throws IOException {
        System.out.printf("%02d%n", 1);
        System.out.printf("%04d%n", 90);

        System.out.println(String.format("%02d", 1));
        System.out.println(String.format("%04d", 90));
    }
}			
				
				
				
01
0090
01
0090				
				
				

3.3.11.2. 前补零

				
package cn.netkiller.test;

import lombok.Data;

import java.io.IOException;
import java.text.DecimalFormat;

@Data
public class Test {
    public static void main(String[] args) throws IOException {
        int test = 520;

        String paddedStr = String.format("%-6s", test).replace(' ', '0');
        System.out.println("后补零:" + paddedStr);
    }
}			
				
				
				
后补零:520000			
				
				

3.3.12. DecimalFormat 文本格式化

			
package cn.netkiller.test;

import lombok.Data;

import java.io.IOException;
import java.text.DecimalFormat;

@Data
public class Test {
    public static void main(String[] args) throws IOException {
        int test = 520;
        System.out.println("================  前补零   =================");
        DecimalFormat decimalFormat = new DecimalFormat("000000");
        String before = decimalFormat.format(test);
        System.out.println("前补零:" + before);

        DecimalFormat decimalFormat1 = new DecimalFormat("0.000");
        System.out.println("================  小数点后补零   =================");
        String after = decimalFormat1.format(test);
        System.out.println("后补零:" + after);
    }
}			
				
			
				
================  前补零   =================
前补零:000520
================  小数点后补零   =================
后补零:520.000
				
			

3.3.13. 通过 stream() 匹配一组字符串

			
		String str1 = "Hello, World!";
        List<String> str2 = Arrays.asList("World", "Hello");

        boolean contains = str2.stream().anyMatch(str1::contains);
        System.out.println("找到字符串:" + contains);			
			
			

3.3.14. 字符串输出转译字符串

			
    public static String escapeString(String input) {
        if (input == null) return null;

        return input
                .replace("\\", "\\\\")   // 转义反斜杠
                .replace("\t", "\\t")    // 转义制表符
                .replace("\b", "\\b")    // 转义退格符
                .replace("\n", "\\n")    // 转义换行符
                .replace("\r", "\\r")    // 转义回车符
                .replace("\f", "\\f")    // 转义换页符
                .replace("'", "\\'")     // 转义单引号
                .replace("\"", "\\\"");  // 转义双引号
    }			
			
			
			
// 使用示例
String original = "Hello\nWorld\t\"Java\"";
String escaped = escapeString(original);
System.out.println(escaped); // 输出: Hello\nWorld\t\"Java\"