关闭

正则表达式

79人阅读 评论(0) 收藏 举报
分类:
一:普通字符
	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;
	}
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5274次
    • 积分:451
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条