正则表达式 【校验必备】

12.4 正则表达式

正则表达式由两种基本字符组成:

原义字符: e.g. a , b , \t , \n , …; 元字符:* + ? $ ^ ( ) [ ] { } 等等

1.正则表达式分类

1.1字符集合类

  • [abc] 将字符进行分类,可以与 [ ] 中的其中一个字符进行匹配
  • [^abc] 对不是 [ ] 内的字符进行匹配(^:取反

1.2范围类

  • [a - z] 表示的是a - z 中的一个字符

注意:" - " 在 [ ] 内表示的是一个范围,而在 [ ] 外表示的是就是 " - " 本身

1.3预定义类

  • 数字字符:
    • \d == [0 - 9] 数字
    • \D == [ ^0 - 9 ] 非数字
  • 空白字符:
    • [ \t \n \x0B \f \r ] == \s
    • [ ^ \t \n \x0B \f \r ] == \S
  • 单词字符:
    • \w == [a - zA - Z0 - 9_]
    • \W == [ ^a - zA - Z0 - 9_]
  • 任何字符: . (与行结束符可能匹配也可能不匹配)

1.4边界字符

边界匹配:是位置,不是字符

  • ^ : 行的开头
  • $ : 行的结尾
  • \b : 单词边界【单词与非单词之间的位置】(这里的单词包括:大小写字母,数字,_ ,中文
  • \B : 非单词边界【单词与单词之间,非单词与非单词之间的位置】

1.5量词

  • ?:出现0次或者1次;
  • +:出现一次或者多次;
  • *:出现任意次;
  • {m,n}:出现m到n次([m,n])
  • {m, }:出现m次或以上
  • { m } :出现正好m次

1.6分组

  • 让一个Xxx,而不是单个X,进行{ 5 },这时就需要用()进行分组

    		System.out.println(s.replaceAll("(http)|(abc)|(java)", "X"));
    		System.out.println(s.replaceAll("[(http)(abc)(java)]", "X"));
    		//这是范围类,( 代指[ ]中其中的一个字符
    
    1.6.1()的功能
    1. 改变正则表达式的优先级

    2. 分组,给每一个括号添加组名,方便后期通过组名来引用这段数据

    3. 作为子正则表达式【正则表达式的嵌套】使用

    4. ? : 忽略分组 表示可以改变优先级但是没有组号

    5. 反向引用:利用分组的编号进行反向引用。反向引用使用 $,必须先分组

      		// 将日期2018-04-27 转换成为 04/27/2018
      		// 2018-04-27 ==> 04/27/2018
      		String regex = "(\\d{4})-(\\d{2})-(\\d{2})";
      		String ss = "2018-04-27";
      		System.out.println("原日期字符串:" + ss);
      		String replace = ss.replaceAll(regex, "$2/$3/$1");
      

1.7|或

  • Hello|World|Java

2.正则表达式在Java当中的应用

  1. 字符串查找操作 Pattern和Matcher

    		String s = "xyyyz";
    		String regex = "x?y+z";		
    		// 1.先将正则表达式编译成正则表达式对象
    		Pattern p = Pattern.compile(regex);
    		// 2.通过正则表达式对象创建匹配器对象
    		Matcher m = p.matcher(s);
    		//System.out.println(m);
    		// 3.通过匹配器对象对字符串进行匹配 查找 替换 等操作
    		boolean matches2 = m.matches();
    		System.out.println(matches2);
    

    ​ find()和group()运用

            //将Hello402World13Java798Android56PHP 
            //字符串中的数字提取出来并且转化成一个排好序的字符串输出。例如 0123456789
            public class HomeWork05 {
                public static void main(String[] args) {
                    String s = "将Hello402World13Java798Android56PHP ";
                    String regex = "\\d+";
                    Pattern p = Pattern.compile(regex);
                    Matcher m = p.matcher(s);
                    String ss = "";
                    while (m.find()) {
                        ss += m.group();
                    }
                    char[] chr = ss.toCharArray();
                    Arrays.sort(chr);
                    //输出方法一:
                    // ss = new String(chr);
                    // System.out.println(ss);
                    //输出方法二:
                    System.out.println(String.valueOf(chr));
                }
            }
    
  2. 字符串匹配操作 字符串的matches()方法 【完全匹配】

    		String s = "Hello.World_123.Good";
    		String regex = "\\w+";
    		System.out.println(s.matches(regex));
    
  3. 字符串替换操作 字符串的replaceAll()和replaceFirst()方法【部分匹配】

  4. 字符串分割 split() 方法

3.正则表达式的嵌套

public class RegexDemo {
	public static void main(String[] args) {
		String str = "Hello,World! in Andoid and java";
		
		Pattern p = Pattern.compile("W(or)(ld!)");
		Matcher matcher = p.matcher(str);
		
		while (matcher.find()) {
			System.out.println("Group 0: " + matcher.group()); 
            // 默认以0组(整个字符串作为正则表达式)匹配 World!
			System.out.println("Group 1: " + matcher.group(1)); 
            // 使用第1组作为子正则表达式匹配 or
			System.out.println("Group 2: " + matcher.group(2)); 
            // 使用第2组作为子正则表达式匹配 ld!
			
			System.out.println("Group 0: Start:" + matcher.start() + ",End: "+ matcher.end()); // [6,12)
            
			System.out.println("Group 1: Start:" + matcher.start(1) + ",End: "+ matcher.end(1)); // [7,9)
            
			System.out.println("Group 2: Start:" + matcher.start(2) + ",End: "+ matcher.end(2)); // [9,12)
            
		}
	}
}

4.动态拼接拼接正则表达式

public static TreeMap<String, WordInfo> getWordsCountInArticle(String article, String... words) {
		// 定义容器,保存单词出现的次数
		TreeMap<String, Integer> tm = new TreeMap<String, Integer>();
		// 定义容器,保存文章中符合正则的单词
		List<String> list = new ArrayList<String>();
		// 定义容器,存储正则表达式字符串
		StringBuilder sb = new StringBuilder();
		
		// 动态拼接拼接正则表达式
		sb.append("\\b("); // \\b(and|for)\\b
		for (int i = 0; i < words.length; i++) {
			if (i == words.length - 1) {
				sb.append(words[i]);
			} else {
				sb.append(words[i]).append("|");
			}
		}
		sb.append(")\\b");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值