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