java字符操作及正则表达式

Java正则表达式+字符串操作

有诗云:

手持两把锟斤拷,口中疾呼烫烫烫。

脚踏千朵屯屯屯,笑看万物锘锘锘。

上回咱们说到java中String以及其常用方法,今天咱们聊一聊字符串相关的其他知识。

字符乱码

文件读取需要注意,在编码格式上要保持一致,否则会出现乱码现象。(按照什么格式写入的数据,就应该按照什么格式读取)

import java.io.*;
import java.nio.charset.Charset;
import java.util.Set;
import java.util.SortedMap;

public class CharsetTest {
    public static void main(String[] args) {

        writeFile1();
        readFile1();
    }

    public static void writeFile1()  {
        //output是从java程序写入到文件中去
        FileOutputStream fos = null;
        OutputStreamWriter osw = null;
        BufferedWriter bw = null;

        String charset = "UTF-8";

        try{
            fos = new FileOutputStream("C:/Users/Yokna/Desktop/test1.txt");
            osw = new OutputStreamWriter(fos,charset);
            bw = new BufferedWriter(osw);

            bw.write("hi");
            bw.newLine();
            bw.write("你好");
            bw.newLine();

        }catch(Exception e){
            e.printStackTrace();
        }finally {
            try {
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void readFile1(){
        FileInputStream fis = null;
        InputStreamReader isr = null;
        BufferedReader br = null;

        try {
            fis = new FileInputStream("C:/Users/Yokna/Desktop/test1.txt");
            isr = new InputStreamReader(fis,"UTF-8");//此处如果修改为GBK编码 则会出现乱码
            br = new BufferedReader(isr);

            String line;
            while((line = br.readLine())!= null){
                System.out.println(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

java的字符编码

源文件编码:采取UTF-8编码

程序内部采用UTF-16存储所有字符

和外界的输入输出尽量采用UTF-8编码

​ 不能使用一种编码写入,换另外一种编码读取

如何将中文字符转化成ASCII编码

1.cmd下进入到需要转化的文件目录

2.调用jdk中native2ascii命令

在这里插入图片描述

在这里插入图片描述

C:\Users\Yokna>cd desktop

C:\Users\Yokna\Desktop>native2ascii test.txt test_zh_CN.txt

C:\Users\Yokna\Desktop>

java中正则表达式的使用

java借助Pattern类与Matcher类使用正则表达式

Pattern类

作用:构造一个正则表达式对象

使用:通常与Match匹配使用,主要是为matcher传递正则表达式

package regex;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class MatcherDemo {
	//构造正则表达式
	private static final String REGEX = "\\bdog\\b";  //\b表示边界
	//待匹配的字符
	private static final String INPUT = "dog dog dog doggie dogg";

	//检查字符串里面有多少个dog
	public static void main(String[] args) {

		//由于Pattern的构造函数是私有的,不可以直接创建,所以通过静态方法compile(String regex)方法来创建,将给定的正则表达式编译并赋予给Pattern类
		Pattern p = Pattern.compile(REGEX);
		//Pattern.matcher(CharSequence input) 对指定输入的字符串创建一个Matcher对象
		Matcher m = p.matcher(INPUT);
		int count = 0;
		while (m.find()) {
			count++;
			System.out.println("Match number " + count);
			System.out.println("start(): " + m.start());
			System.out.println("end(): " + m.end());
		}
	}
}
Matcher类

作用:按照正则表达式的规则匹配字符串

用法:见代码及注解

matcher.lookingAt与matcher.matches方法

//两种查询用法及区别
public class MatchesLooking {

    private static final String REGEX = "foo";
    private static final String INPUT =
        "foo00000";
    private static Pattern pattern;
    private static Matcher matcher;

    public static void main(String[] args) {
   
        // Initialize
        pattern = Pattern.compile(REGEX);
        matcher = pattern.matcher(INPUT);

        System.out.println("Current REGEX is: "
                           + REGEX);
        System.out.println("Current INPUT is: "
                           + INPUT);

        //此处是为了区分matcher.lookingAt与matcher.matches的区别
        //matcher.lookingAt是模糊查询,部分匹配就会返回True
        //matcher.matches是完全匹配,类似与精准查询
        System.out.println("lookingAt(): "
            + matcher.lookingAt());  //部分匹配
        System.out.println("matches(): "
            + matcher.matches());    //完全匹配
    }
}

find、appendReplacement、appendTail方法

//查找并替换
public class RegexDemo {
 
    private static String REGEX = "a*b"; //*表示限定前面的a可以有0或者多个。
    private static String INPUT = "aabfooaabfooabfoobcdd";
    private static String REPLACE = "-";
 
    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        Matcher m = p.matcher(INPUT); // get a matcher object
        //StringBuffer是可变类型的字符对象,且线程安全,append方法添加字符串较快
        StringBuffer sb = new StringBuffer();
        //全部替换
        while(m.find()){
            //find()尝试查找与该模式匹配的输入序列的下一个子序列。成功则返回true  
            m.appendReplacement(sb,REPLACE);
            //appendReplacement方法会把匹配到的内容替换为REPLACE,并且把从上次替换的位置到这次替换位置之间的字符串也拿到,然后,加上这次替换后的结果一起追加到StringBuffer里(假如这次替换是第一次替换,那就是只追加替换后的字符串啦)
        }
        //appendTail方法把最后一次匹配到内容之后的字符串追加到StringBuffer中
        m.appendTail(sb); 
        System.out.println(sb.toString());
    }
}

replaceAll方法

public class ReplaceDemo {
 
    private static String REGEX = "dog";
    private static String INPUT =
        "The dog says meow. All dogs say meow.";
    private static String REPLACE = "cat";
 
    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        // get a matcher object
        Matcher m = p.matcher(INPUT);
        INPUT = m.replaceAll(REPLACE);  //把所有的dog都换成cat
        System.out.println(INPUT);
    }
}

字符串的拆分

//以“,”为分割 拆分字符串
String a = "123,321,,   abc";
String[] as = a.split(",");

//调用第三方包com.google.common.base下的Splitter拆分字符串
//拆分字符串,忽略空字符串
 Iterable<String> split = Splitter.on(',')//以“,”为拆分标准拆分字符串
                .trimResults()//忽略掉空格
                .omitEmptyStrings()//忽略掉空字符串
                .split("123,321,,   abc");
//实现Iterable接口,可以使用foreach循环
for (String s : split) {
            System.out.println(s);
        }

字符串与list相互转换

list转字符串
public static void main(String[] args) {
    	//构造字符串列表
    	List<String> names = new LinkedList<String>();
        names.add("Xiaohong");
        names.add("Xiaoming");
        names.add("Daming");
        names.add("Xiaohei");
        
        //合并为一个字符串,以逗号相连
    	//下面的join方法,会将names列表中的元素加在一起形成一个字符串,元素之间以“,”隔开
        String nameStr = String.join(",",names);
        
    }
字符串转list
public static void main(String[] args) {
		List<String> names = new LinkedList<String>();
        names.add("Xiaohong");
        names.add("Xiaoming");
        names.add("Daming");
        names.add("Xiaohei");
        
        //从ArrayList变到字符串
        String str1 = String.join(",", names);  //String.join, JDK 8 引入
        System.out.println(str1);
       
        String str2 = StringUtils.join(names, ",");  //Apache Commons Lang
        System.out.println(str2);
        
        //从字符串变回ArrayList
        List<String> names2 = Arrays.asList(str2.split(",")); 
        for(String name:names2)
        {
        	System.out.println(name);
        }
        
        //StringUtils 可以支持更多数据类型
        List<Integer> ids = new ArrayList<Integer>();
        ids.add(1);
        ids.add(3);
        ids.add(5);
        String str3 = StringUtils.join(ids, ",");  
        System.out.println(str3);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值