了解学习正则

1.简介

    为什么需要正则表达式?

        -文本的复杂处理

    正则表达式的优势和用途?

        -一种强大而灵活的文本处理工具

        -大部分编程语言、数据库、文本编辑器、开发环境都支持正则表达式

    正则表达式定义:

        -描述一个规则,通过规则匹配一类字符串

        -学习正则表达式等于学习正则表达式的语法规则

2.普通字符

    -字母、数字、汉字、下划线、以及没有特殊定义的标点符号,都是“普通字符”。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。

    简单的转义字符

3.标准字符集合

    -能够与‘多种字符’匹配的表达式

    -注意区分大小写,大写是相反的意思

4.自定义字符集合

    -[]方括号匹配方式,能够匹配方括号中任意一个字符

     -正则表达式的特殊符号,被包含到中括号中,则失去特殊意义,除了^,-之外。

    -标准字符集合,除小数点外,如果被包含于中括号,自定义字符集合将包含该集合。比如:[\d.\-+]将匹配:数字、小数点、+、-

5.量词

     -修饰匹配次数的特殊符号

    -匹配次数中的贪婪模式(匹配字符越多越好,默认!)例如:\d{3,6}  匹配3到6个数字

    -匹配次数中的非贪婪模式(匹配字符越少越好,修饰匹配次数的特殊符号后再加上一个“?”号) 例如:\d{3,6}?  匹配3个数字

6.字符边界

    -^不是中括号里面的,是外面的

    -\b匹配这样一个位置:前面的字符和后面的字符不全是\w

7.正则表达式的匹配模式(工具使用)

    IGNORECASE  忽略大小写模式(匹配时忽略大小写,默认区分大小写)

    SINGLELINE 单行模式(默认:整个文本看作一个字符串,只有一个开头,一个结尾;时小数点“.”可以匹配包含换行符(\n)在内的任意字符)

    MULTILINE 多行模式(每行都是一个字符串,都有开头和结尾;在指定了MULTILINE之后,如果需要仅匹配字符串开始和结束为止,可以使用\A和\Z)

8.选择符和分组

    -反向引用(\nnn):每一对()会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号;通过反向引用,可以对分组已捕获的字符串进行引用。

9.预搜索(零宽断言)

    -只进行子表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度

    -这个位置应该符合某个条件。判断当前位置的前后字符,是否符合指定的条件,但不匹配前后的字符。是对位置的匹配

    -正则表达式匹配过程中,如果子表达式匹配到的是字符内容,而非位置,并被保存到最终的匹配结果中,那么就认为这个子表达式是占有字符的;如果子表达式匹配的仅仅是位置,或者匹配的内容并不保存到最终的匹配结果中,那么就认为这个子表达式是零宽度的。占有字符还是零宽度,是针对匹配的内容是否保存到最终的匹配结果中而言的。

10.常见正则表达式列表

11.正则应用方向

    -开发环境和文本编辑器中使用(eclipse、Notepad++、Editplus、UltraEdit)

    -数据库中使用:Mysql5.5以上,Oracle10g以上

        例如:SELECT prod_name FROM products WHERE prod_name REGEXP '.000' (.匹配任意字符)

12.java测试

//测试正则表达式的基本用法
public static void main(String[] args) {
	//在这个字符串:asfsdf23323,是否符合指定的正则表达式:\w+
	//表达式对象
	Pattern p = Pattern.compile("\\w+");
	//创建Matcher对象
	Matcher m = p.matcher("asfsdf2&&3323");
//	boolean yesorno = m.matches();	//尝试将整个字符序列与该模式匹配
//	System.out.println(yesorno);
		
//	boolean yesorno2 = m.find();	//该方法扫描输入的序列,查找与该模式匹配的下一个子序列
//	System.out.println(yesorno2);
		
//	System.out.println(m.find());
//	System.out.println(m.group());
//	System.out.println(m.find());
//	System.out.println(m.group());
		
	
	while(m.find()){
		System.out.println(m.group());	//group(),group(0)匹配整个表达式的子字符串
		System.out.println(m.group(0));
	}
		
}

//测试对象中分组的处理
public static void main(String[] args) {
	//在这个字符串:asfsdf23323,是否符合指定的正则表达式:\w+
	//表达式对象
	Pattern p = Pattern.compile("([a-z]+)([0-9]+)");
	//创建Matcher对象
	Matcher m = p.matcher("aa232**ssd445*sds223");
	
	while(m.find()){
		System.out.println(m.group());	//group(),group(0)匹配整个表达式的子字符串
		System.out.println(m.group(1));
		System.out.println(m.group(2));
	}
		
}

//测试替换操作
public static void main(String[] args) {
	//表达式对象
	Pattern p = Pattern.compile("[0-9]");
	//创建Matcher对象
	Matcher m = p.matcher("aa232**ssd445*sds223");
	//替换
	String newStr = m.replaceAll("#");
	System.out.println(newStr);
		
		
}

//测试分割操作
public static void main(String[] args) {
	String str = "a232b4334c3434";
	String[] arrs = str.split("\\d+");
	System.out.println(Arrays.toString(arrs));
		
}


//网络爬虫取链接
/**
* 获得urlStr对应的网页的源码内容
 * @param urlStr
 * @return
 */
public static String  getURLContent(String urlStr,String charset){
	StringBuilder sb = new StringBuilder();
	try {
		URL url = new URL(urlStr);
		BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(),Charset.forName(charset)));
		String temp = "";
		while((temp=reader.readLine())!=null){
			sb.append(temp);
		}
	} catch (MalformedURLException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
	return sb.toString();
}

public static List<String> getMatherSubstrs(String destStr,String regexStr){

	Pattern p = Pattern.compile(regexStr);		//取到的超链接的地址
	Matcher m = p.matcher(destStr);
	List<String> result = new ArrayList<String>();
	while(m.find()){
		result.add(m.group(1));
	}	
	return result;
}
	
public static void main(String[] args) {
	String destStr = getURLContent("http://www.163.com","gbk");
		
//	Pattern p = Pattern.compile("<a[\\s\\S]+?</a>");		//取到的超链接的整个内容
	List<String> result = getMatherSubstrs(destStr, "href=\"([\\w\\s./:]+?)\"");
		
	for (String temp : result) {
		System.out.println(temp);
	}
		
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值