一:普通字符 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; } }
6万+

被折叠的 条评论
为什么被折叠?



