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));
    }	
			
			

3.3.5. 字符串替换处理

			
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.1. 正则表达式查找与替换

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

				
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.2. 利用正则快速转换时间格式

				
// 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.3. 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.4. 字符串处理,删除中文以外的字符

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.5. 取出字符串中的中文字符

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.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. 通过 stream() 匹配一组字符串

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

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