Java字符处理(java.util.regex)

正则表达式

正则表达式(Regular Expression)

  • 或叫做规则表达式,是计算机科学的一个基础概念
  • 用事先定义好的一些特定字符、及这些特定字符的组合,组成一 个“规则字符串”
  • 比如:^[A-Za-z]+$, 就代表着一个字符串,只能由26英文字母组成
  • 主要作用:
    1. 测试字符串内的模式
    2. 识别/替换文本
    3. 提取文本

正则表达式的定义有很多相关书籍和各种网上资料,在此处给出一本推荐参考书:
精通正则表达式(第三版),Jeffrey E.F.Friedl著, 余晟翻译,电子工业出版社,2012

和一个CSDN的正则表达式汇总文章:最全常用正则表达式大全_ZhaoYingChao88的博客-CSDN博客_最全的常用正则表达式大全

 主要来看看Java中的正则表达式

Java正则表达式

主要使用java.util.regex包

    –Pattern 正则表达式的编译表示
          compile :编译一个正则表达式为Pattern对象
          matcher :用Pattern对象匹配一个字符串,返回匹配结果

    –Matcher
        Index Methods(位置方法) // start(), start(int group), end(), end(int group)
        Study Methods(查找方法) // lookingAt(), find(), find(int start), matches()
        Replacement Methods(替换方法) //replaceAll(String replacement)

下面呈上使用实例:

第一个:寻找字符串中的“dog”

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";

	public static void main(String[] args) {
		//检查字符串里面有多少个dog
		Pattern p = Pattern.compile(REGEX);//编译REGEX得到一个Pattern(模板)对象
		
		Matcher m = p.matcher(INPUT);//用模板来匹配INPUT字符串得到一个Matcher(匹配)对象
		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());
		}
	}
}

输出结果——>:

第二个:部分匹配方法: lookingAt() 与完全匹配方法: matches() 的使用

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

public class MatchesLooking {

    private static final String REGEX = "foo";
    private static final String INPUT ="foo-foa-foo";
    private static Pattern p;
    private static Matcher m;

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

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

        System.out.println("lookingAt(): "
            +m .lookingAt());  //部分匹配
        System.out.println("matches(): "
            + m.matches());    //完全匹配
    }
}

输出结果如图

第三个:替换指定字符串

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

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 sb = new StringBuffer();
        //全部替换
        while(m.find()){
        	//用REPLACE中的字符串进行替换,再将替换的结果放到sb变量中
            m.appendReplacement(sb,REPLACE);
        }
        //将最后的尾巴字符串附加上
        m.appendTail(sb); 
        System.out.println(sb.toString());
    }
}

输出:-foo-foo-foo-cdd

第四个:将字符串INPUT中的"dog"换成"cat"

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

其他字符串操作

  •  字符串和集合互转
     

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Scanner;
    
    import org.apache.commons.lang3.StringUtils;
    
    /**
     * 采用Apache Commons Lang 来完成字符串和集合转化
     * @author Tom
     *
     */
    
    public class String2List {
    
    	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);  //out: Xiaohong,Xiaoming,Daming,Xiaohei
           
            String str2 = StringUtils.join(names, ",");  //Apache Commons Lang
            System.out.println(str2);  //out: Xiaohong,Xiaoming,Daming,Xiaohei
            
            //从字符串变回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);  //out: 1,3,5
    	}
    	
    }
    		//以下方法多来自于Google的com.google.common.*;
            List<Integer> list = new ArrayList<Integer>();
            list.add(123);
            list.add(456);
            System.out.println(list); 		//out: [123,456]
            
            //直接初始化List数组
            List<Integer> integers = Lists.newArrayList(123, 456);
            System.out.println(integers);		//out:[123,456]
    
            //拆分字符串,忽略空字符串
            Iterable<String> split = Splitter.on(',')
                    .trimResults()
                    .omitEmptyStrings()
                    .split("123,321,,   abc");
    
            for (String s : split) {
                System.out.print(s+" ");
            } 	//out: 123 321 abc

  • 变量名字格式化
    –名字驼峰命名

      String s1 = "CONSTANT_NAME";
            String s2 = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, s1);
            System.out.println(s2); //constantName;

  • 字符串输入流
    Scanner就不用多说了吧,应该都熟悉

    import org.apache.commons.io.Charsets;
    import org.apache.commons.io.IOUtils;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Scanner;
    
    /**
     * 采用Apache Commons IO 完成字符串转成字符流
     * @author Tom
     *
     */
    
    public class String2InputStream {
    
        public static void main(String[] args) throws IOException {
        	//构造字符串列表
        	List<String> names = new LinkedList<String>();
            names.add("Xiaohong");
            names.add("Xiaoming");
            names.add("Daming");
            names.add("Xiaohei");
            
            //合并为一个字符串,以逗号相连
            String nameStr = String.join(",",names);
            
            //将字符串作为默认的输入流
            InputStream in = IOUtils.toInputStream(nameStr, Charsets.toCharset("UTF-8"));
            //重置系统的输入流
            System.setIn(in);
            
            //此处也可以换成一个文件输入流,如:Scanner sc = in;
            Scanner sc=new Scanner(System.in);
            sc.useDelimiter(",");
            while(sc.hasNext())
            {
                System.out.println(sc.next());
            }
        }
    }
    

有许多源码和参考资料是来自华东师范大学陈良育老师

他在MOOC上有开课,大家可以关注一下 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值