Student的博客

记录程序猿的点点滴滴

正则表达式

一:普通字符
	1、字母、数字、汉字、下划线以及没有特殊定义的标点符号,都是"普通字符"。表达式中的
	普通字符,在匹配一个字符串时,匹配与之相同的一个字符。
	2、简单的转义字符:与C语言,java中的转义字符一样
		\n		代表换行符
		\t		代表制表符
		\\ 		代表本身
		.......


二:标准字符集:能够与'多种字符'匹配的表达式(注意区分大小写,大写是相反的意思)
	1、\d	0-9中的任意一个数字  	(\D:就是不是0-9中任意一个字符)
	2、\w	任意一个字母、数字、下划线。包括大小写
	3、\s	包括空格、制表符、换行符等空白字符中的任意一个
	4、.	匹配除了"\n"外的任意一个字符。(如果要包括"\n",一般用[\s\S])
	
三:自定义字符集合:[]方括号匹配方式,能够匹配方括号中的任意一个字符
	1、[ab5@]	表示匹配"a"或"b"或"5"或"@"
	2、[^abc]	匹配除了"a","b","c"之外的任意一个字符
	3、[f-k]	匹配"f"到"k"之间的任意一个字符
	4、[^f-k0-3]	匹配除了"f"-"k",0-3之外的任意一个字符
	注意:
	1、正则表达式中的特殊符号,被包含于括号中,将失去特殊意义,除了^,-之外
	2、标准字符集,除了.以外,如果被包含于[]中,自定义字符集合将包含该集合
	eg:[\d.-+]将匹配:数字、".","+","-"
	这里+号失去了量词中的特殊意义,.号失去了标准字符集中的特殊意义
	
四:量词(Quantifier):修饰匹配次数的特殊符号
	1、{n}		表达式重复n次
	2、{m,n}	表达式至少重复m次,最多重复n次
	3、{m,}		表达式至少重复m次
	4、?		匹配表达式0次或者1次,相当于{0,1}
	5、+		表达式至少出现一次,相当于{1,}
	6、*		表达式不出现或者出现任意次,相当于{0,}
	匹配次数中的贪婪模式:匹配字符越多越好,这是默认形式。
	匹配次数中的非贪婪模式:匹配次数越少越好,在匹配次数的特殊符号后面加上一个"?"号
	
五:字符边界:本组标记匹配不是字符而是位置,符合某种条件的位置
	1、^	与字符串开始的地方匹配
	2、$	与字符串结束的地方匹配
	3、\b	匹配一个单词边界
	\b匹配这样一个位置:前面的字符和后面的字符不全是\w
	
六:正则表达式的匹配模式:
	1、忽略大小写模式:默认情况下正则表达式是要区分大小写的,按下Case insensitive键就可以了
	2、单行模式:整个文本看做一个字符串,只有一个开头,一个结尾。使"."可以 匹配\n在内的任意字符
	3、多行模式:每一行都是一个字符串,都有开头和结尾。在指定了多行模式之后,如果需要仅匹配字符串
		开始和结尾的位置可以使用\A和\Z
		
七:选择符和分组
	1、|	分支结构	左右两边表达式是或的关系
	2、()捕获组	
		1)、再被修饰匹配次数时,括号中的表达式可以看做整体来处理
		2)、取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到
		3)、每一对括号分配一个编号,使用()的捕获组根据左括号的顺序从1开始自动编号。捕获元素编号为0的第一个捕获组是由整个正则表达式模式匹配的文本。
	3、(?:exp)非捕获组:一些表达式中,不得不使用(),但又不需要保存()中子表达式匹配
		的内容,这时可以用非捕获组来抵消使用()带来的副作用。
	反向引用(\nnn)
		1)、每对()会分配一个编号,使用()的捕获组根据左括号的顺序从1开始自动编号
		2)、通过反向引用,可以对分组已捕获的字符串进行引用
		eg:([a-z]{2})\1  可以匹配到如:gogo toto dodo
		这里的解释是:()是匹配到的内容,\1是对该内容的引用。
		([a-z]{2})\1{2}对内容引用两次    可以匹配到:gogogo tototo dododo等
		(?:[a-z]{2})\1 没有匹配到的内容,因为()中的内容并不保存到内存中,因此无法引用
		
八:预收索:
	1、只进行子表达式的匹配,匹配内容不计入最终结果,是0宽度
	2、这个位置应该符合某个条件。判断当前位置的前后字符,是否符合指定的条件。
	3、正则表达式匹配过程中,如果子表达式匹配到的是字符内容,而非位置,并被保存到最终的匹配结果中
		那么就认为整个子表达式是占有字符的;如果子表达式匹配到的仅仅是位置,或者匹配到内容
		并不保存到最终的匹配结果中,那么就认为这个子表达式是0宽度的。
	(?=exp)	断言自身出现的位置的后面能匹配表达式exp
	(?<=exp)断言自身出现的位置的前面能匹配表达式exp
	(?!exp)	断言自身出现的位置的后面不能匹配表达式exp
	(?<!exp)断言自身出现的位置的前面不能匹配表达式exp
	
	[a-z]+(?=exp) 可以匹配到:going,doing ....等中的go,do
	
九:java中使用正则的相关类位于:java.util.regex包下面
	1、Pattern类:正则表达式的编译表示形式。
		Pattern p = Pattern.compile(r,int);// 建立正则表达式
	2、Matcher类:通过解释Pattern对字符序列执行匹配操作的引擎
		Matcher m = p.matcher(str);// 匹配str字符串
        Matcher		匹配程序,匹配器

package com.chen.regex;

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

/**
 * 测试正则表达式的基本用法
 * 常用的方法:
 * matches();// 尝试将整个字符序列与模式进行匹配
 * m.find();// 该方法是扫描整个字符序列,查找下一个满足要求的子序列,有点像指针
 * m.group();// group()等于group(0),输出满足要求的子序列
 * replaceAll()	替换操作
 * split(regex)进行分割操作
 * @author CHJ
 *
 */
public class Demo01 {

	public static void main(String[] args) {
		
//		test01();
//		test02();
//		test03();
		test04();
	}
	
	/**
	 * 模式匹配查找、输出
	 */
	public static void test01() {
		
		// 创建正则表达式对象
		Pattern p = Pattern.compile("\\d+");// 匹配数字串
		// 创建Matcher对象
		Matcher m = p.matcher("1As1323**4ds##xcxj3232");
		
//		boolean result = m.matches();// 尝试将整个字符序列与模式进行匹配
//		System.out.println(result);
		
		boolean result2 = m.find();// 该方法是扫描整个字符序列,查找下一个满足要求的子序列
		System.out.println(result2);
		System.out.println(m.group());// group()等于group(0),输出满足要求的子序列
		
		m.find();
		System.out.println(m.group());
		
		System.out.println("==================");

	
		while(m.find()) {
			
			System.out.println(m.group());
		}
		
	}
	/**
	 * 测试正则表达式的分组处理
	 */
	public static void test02() {
		
		Pattern p = Pattern.compile("([a-z]+)([0-9]+)");
		Matcher m = p.matcher("121dsad#ds121vc**dcs12");
		
		while(m.find()) {
			
			System.out.println(m.group());// group(0)代表的是([a-z]+)([0-9]+)匹配的结果
			System.out.println(m.group(1));// group(1)表示([a-z]+)匹配的结果
			System.out.println(m.group(2));// group(2)表示([0-9]+)匹配的结果
		}
	}
	
	/**
	 * 正则表达式的替换操作
	 */
	public static void test03() {
		
		Pattern p = Pattern.compile("[0-5]");
		Matcher m = p.matcher("192**csds32546js**22474");
		
		String str = m.replaceAll("@");
		System.out.println(str);
	}
	
	/**
	 * 测试字符串的分割操作
	 */
	public static void test04() {
		
		String str = "3213ssf24343cxdf324vcdv3";
		String[] arras = str.split("[a-z]+");// 按字符串来分割
		System.out.println(Arrays.toString(arras));
	}
}

package com.chen.regex;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 网络爬虫获取网页源码中的超链接URL
 * @author CHJ
 *
 */
public class WebSpriderToGetUrl {

	public static void main(String[] args) {
		
		String srcStr = getResources("http://www.sina.com", "utf8");
//		"http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js"
		String regexStr = "\"http://([\\s\\S]+?)\"";
		List<String> list = getURL(srcStr, regexStr);
		
		for (String temp : list) {
			
			System.out.println(temp);
		}
	}
	
	/**
	 * 获取网页的源代码字符串
	 * @param srcURL
	 * @param charset
	 * @return
	 */
	public static String getResources(String srcURL, String charset) {
		
		
		StringBuilder sb = new StringBuilder();
		try {
			URL url = new URL(srcURL);
			BufferedReader reader = new BufferedReader(new InputStreamReader
					(url.openStream(),Charset.forName(charset)));// 转化成指定字符集
			String temp = null;
			while((temp = reader.readLine()) != null) {

				sb.append(temp);
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return sb.toString();

	}
	
	/**
	 * 获得网页中URL并且存入到list链表中
	 * @param srcStr
	 * @param regexStr
	 * @return
	 */
	public static List<String> getURL(String srcStr, String regexStr) {
		
		List<String> list = new ArrayList<String>();
		Pattern p = Pattern.compile(regexStr);
		Matcher m = p.matcher(srcStr);
		
		while(m.find()) {
			
			list.add(m.group(0));
		}
		return list;
	}
}


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wo_aisilebiancheng/article/details/49933843
个人分类: 初学Java
上一篇单例模式的破解和保护
下一篇前缀,中缀,后缀表达式的转换,表达式的求值
想对作者说点什么? 我来说一句

正则表达式正则表达式

2011年01月10日 15KB 下载

正则表达式

2010年05月21日 97B 下载

正则表达式入门指导.ppt

2011年04月02日 694KB 下载

正则表达式总结文档集合

2009年03月19日 370KB 下载

xml需求文档及正则表达式介绍

2011年05月20日 12.68MB 下载

正则表达式简单课程学习

2011年07月10日 12KB 下载

RegexTester 正则表达式

2018年01月12日 69KB 下载

正则指引书籍

2018年04月23日 30.62MB 下载

没有更多推荐了,返回首页

关闭
关闭