黑马程序员——正则表达式-整理笔记

本文是关于Java中正则表达式的整理笔记,探讨了正则表达式的基本概念、作用和特点,以及常见符号的使用。特别指出字符类在正则表达式中的重要性,并举例说明了如何使用matches()方法进行字符串匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                             ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


正则表达式

    概念:符合一定规则的表达式
    作用:专门用于操作字符串;
    特点:用于一些特定的符号来表示一些代码操作,这样就简化了书写;
    好处:可以简化对字符串的复杂操作;
    弊端:规则字符定义的越多,越不便阅读,造成阅读性差;

    常见的符号:

字符类
[abc]abc(简单类)
[^abc]任何字符,除了 abc(否定)
[a-zA-Z]azAZ,两头的字母包括在内(范围)
[a-d[m-p]]admp[a-dm-p](并集)
[a-z&&[def]]def(交集)
[a-z&&[^bc]]az,除了 bc[ad-z](减去)
[a-z&&[^m-p]]az,而非 mp[a-lq-z](减去)
 
预定义字符类
.任何字符(与行结束符可能匹配也可能不匹配)
\d数字:[0-9]
\D非数字: [^0-9]
\s空白字符:[ \t\n\x0B\f\r]
\S非空白字符:[^\s]
\w单词字符:[a-zA-Z_0-9]
\W

非单词字符:[^\w]

边界匹配器
^行的开头
$行的结尾
\b单词边界
\B非单词边界
\A输入的开头
\G上一个匹配的结尾
\Z输入的结尾,仅用于最后的结束符(如果有的话)
\z输入的结尾
 
Greedy 数量词
X?X,一次或一次也没有
X*X,零次或多次
X+X,一次或多次
X{n}X,恰好 n
X{n,}X,至少 n
X{n,m}X,至少 n 次,但是不超过 m 次 

字符类可以出现在其他字符类中,并且可以包含并集运算符(隐式)和交集运算符 (&&)。并集运算符表示至少包含其某个操作数类中所有字符的类。交集运算符表示包含同时位于其两个操作数类中所有字符的类。

1    字面值转义    \x
2    分组[...]
3    范围a-z
4    并集[a-e][i-u]
5    交集[a-z&&[aeiou]]

注意,元字符的不同集合实际上位于字符类的内部,而非字符类的外部。例如,正则表达式 . 在字符类内部就失去了其特殊意义,而表达式 - 变成了形成元字符的范围。


具体操作功能
             ①匹配:String matches()方法;用规则匹配整个字符串,只要有一处不符合规则,则返回false

public class Test1{
	
	public static void main(String[] args) {
		String qq="2343434";
    	String regex = "[1-9][0-9]{4,14}";  
        boolean flag = qq.matches(regex);  
        if(flag)  
            System.out.println("qq号码格式正确");  
        else  
            System.out.println("qq号码格式不正确");  
	}
}

             ②切割:String split(String regex)方法;根据给定正则表达式的匹配拆分此字符串

public class Test2{
	
	public static void main(String[] args) {
		 /* 
                        按照叠词进行切割,为了可以让规则的结果被重用,可以将规则用()封装成一个组,组都是 
                       有编号的,从1开始;  想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取 
        */
		   //通过叠词进行切割  
	      split("sdssssfddfgggdd", "(.)\\1");  
	        //通过点"."进行切割  
	      split("aaa.sss.sfsss", "\\.");           
	        //通过空格" "进行切割  
	      split("asas asas     asa", " +");   
	}
	 public static void split(String str, String regex){  
         
	        String [] arr = str.split(regex);  
	        System.out.println(arr.length);  
	        for(String s : arr){  
	            System.out.println(s);  
	        }  
	    }
}


             ③替换:String replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

public class Test {

	public static void main(String[] args) {
		String str = "sfsdfdddvdvfsaaavxcvddd";
		String regex = "(.)\\1+"; // (.)任何字符出现一次或多次
		// String newStr1 = "\\$";//将叠词替换成$
		String newStr2 = "$1";// 将叠词替换为它本身单个字符
		str = str.replaceAll(regex, newStr2);
		System.out.println(str);
	}

             ④获取:Pattern p = Pattern.compile(reg); Matcher m = p.matcher(str);

/* 
 4,获取:将字符串中的符合规则的子串取出。 
 操作步骤: 
 1,将正则表达式封装成对象。 
 2,让正则对象和要操作的字符串相关联。 
 3,关联后,获取正则匹配引擎。 
 4,通过引擎对符合规则的子串进行操作,比如取出。 
 */
import java.util.regex.*;

class Test {
	public static void main(String[] args) {
		getDemo();
	}
	public static void getDemo() {
		String str = "jin tian wo yao qu duan lian。";
		System.out.println(str);
		String reg = "\\b[a-z]{4}\\b"; //匹配四个字母的单词
		// 将规则封装成对象。
		Pattern p = Pattern.compile(reg);
		// 让正则对象和要作用的字符串相关联。获取匹配器对象。
		Matcher m = p.matcher(str);
		// System.out.println(m.matches());//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。
		                                    // 只不过被String的方法封装后,用起来较为简单。但是功能却单一。

		//m.find()将规则作用到字符串上,并进行符合规则的子串查找。
		while (m.find()) {
			//用于获取匹配后结果。
			System.out.println(m.group());
			System.out.println(m.start() + "...." + m.end());
		}
	}
}


// 演示 网络爬虫

/*是一段小程序,专门负责获取指定规则的数据。
 需求: 获取指定文件的特定信息,比如邮箱地址
 1 读取文件
 2 获取文件中的每一行字符串
 3 对该行字符串中的特定信息进行规则的匹配,将符合规则都获取出来,并进行存。
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NetBug {
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		readMail();
	}

	public static void readMail() throws IOException {

		URL url = new URL("http://192.168.1.20:8080/index.jsp");// 爬服务器的邮箱

		URLConnection conn = url.openConnection();
		BufferedReader bufIn = new BufferedReader(new InputStreamReader(
				conn.getInputStream()));

		// 如果不需要操作消息头,,不需要获取openConnection(); url.openStream();
		// BufferedReader bufr = new BufferedReader(new
		// FileReader("c:\\mail.htm"));

		String line = null;

		// 定义规则。mail规则。
		String reg = "[a-zA-Z0-9_]+@\\w+(\\.\\w+)+";
		Pattern p = Pattern.compile(reg);
		while ((line = bufIn.readLine()) != null) {// 匹配器通过流读的

			Matcher m = p.matcher(line);
			while (m.find()) {
				System.out.println(m.group());// 不应该打印,存到集合里,在存到数据库
			}
		}

		bufIn.close();

	}
}



                                                             ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值