正则表达式语法|Java正则表达式使用

1.   正则表达式语法

使用工具 :RegexBuddy.exe  正则匹配

1. 标准字符集合
  \n: 换行符
  \t: 制表符
  \\  \^  \$: 需要特殊转义的 
  \d :  数字 0-9 任意一个数字
  \D :  非数字
  \w :  字母 A-Z,a-z,_  任意一个字母或下划线
  \W:    非 字母 A-Z,a-z,0-9,_
  \s:   空格、制表符、换行符等空白字符其中任意一个
   .:   匹配任意字符(除了换行符)    
 包括任何字符:[\s\S]

2. 自定义字符集合
  []  方括号,匹配反括号中任意一个字符
[abc@]: 匹配a,b,c,@ 任意一个字符, 里面是 a或b或c 的意思 
[^abc]:  匹配 a,b,c 之外 任意一个字符
[a-z] :  匹配 a-z 之间 任意一个字母
[^a-f0-3]:  a-f 0-3 之外的任意一个字符    
  注意: 正则表达式的特殊符号在[]内,除了^,-之外 都是去了 特殊含义,
  比如[.]  就是表示.

3. 量词:
  {n}: 表示重复 n次 
  {m,n}:   至少重复m次,最多重复n 次
  {m,}:  表达式至少重复m次
  ?   : 表达式 0次或者 1次 ,相当于  {0,1}
 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}
  +   : 表达式出现1 次,或者任意次,相当于 {1,}
  *   : 表达式不出现或者出现任意次,相当于{0,}
  
 例子:\d{3,6} 表示第一个数字开头,可以出现3-6次  2333  5666 比如
  贪婪模式:
  \d{3,6} :  默认是 \d{3,6}!  匹配字符越多越好,比如 123456 从1开始匹配到6
  非贪婪模式:
  \d{3,6}:  \d{3,6}? , 匹配字符越少越好,   123456从1开始只匹配 123重新开始匹配 456

4. 字符边界,匹配的是符合某一个条件的位置
 ^ :  与字符开始地方匹配

$ :  与字符结束地方匹配

扫描二维码关注公众号,回复: 11230693 查看本文章


 \b:  前面 或者后面 不是 \w
 
 匹配一个单词边界 ,匹配单词 左右 边界


 
 5.  
 A|B: 匹配A 或 B 
 
 
  6. 对正则表达式结果进行 过滤      正则表达式断言
  
  [a-z]+(?=\d+)


  [a-z]+(?!\d+)


  
  
  电话号码匹配: 0\d[2,3]-\d[7,9]  
  手机号码 : (1[35789]\d{9})|(0\d{2,3}-\d{7,9})
  
 
 邮箱匹配:
 [\w\-]+@[a-z0-9A-Z]+(\.[A-Za-z]{2,4}){1,2}
 110  @ qq.com.cn 

2.   正则表达式使用

2.1.  开发工具中使用: 

基本开发工具支持正则表达式查找 notepad++

2.2  数据库使用:

数据库 也可以支持正则表达式  ,mysql5.5  oracle 10g
 例子:select prod_name from products where prod_name REGEXP '.000'


2.3.  java 程序中 正则表达式

2.3.1. 使用 正则表达式  对象 全局匹配 ,逐个匹配 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.junit.Test;

public class TestPartern {
   
	@Test
	public void test1(){
	//  使用 正则表达式  对象 全局匹配 ,逐个匹配 
				Pattern p= Pattern.compile("\\d{2}");
			// 创建 Matcher 对象
				Matcher m= p.matcher("2998775451");
				// 尝试将 整个 字符串序列 与该模式匹配
			boolean yesorno= m.matches(); 
			System.out.println(yesorno);   // 匹配成功 true
			while(m.find()){  
				/***  逐个匹配 
				 * 98
                   77
                   54
                   51 
				 */
				System.out.println(m.group());  
			}	
	}
}


2.3.2.  分组匹配

public void test2(){
	//  正则表达式  对象
			Pattern p= Pattern.compile("(\\d+)(\\w+)");
		// 创建 Matcher 对象
			Matcher m= p.matcher("2998775451xiaoming");
			// 尝试将 整个 字符串序列 与该模式匹配
		//	boolean yesorno= m.matches(); 
			while(m.find()){  
				// 获取匹配 结果 
				System.out.println(m.group());  //2998775451xiaoming
				System.out.println(m.group(1));  //第一组匹配内容:(\\d+) 2998775451
				System.out.println(m.group(2));  //第二组匹配内容:(\\w+) xiaoming
			}; 
		//	System.out.println(yesorno);
	}


2.3.3   字符串 替换、 分割

	// 字符串 替换、 分割
	@Test
	public void test3(){
	//  正则表达式  对象
				Pattern p= Pattern.compile("[0-9]");
			// 创建 Matcher 对象
				Matcher m= p.matcher("[email protected]");
		// 替换  ##########@qq.com
			String newStr= m.replaceAll("#");
			System.out.println(newStr);
			
			// 分割
	 String str="a12b12x445d";
	 String[] arrs= str.split("\\d+");
	 System.out.println(Arrays.toString(arrs));	
	}


2.3.4  模仿爬虫,取出图片  

	/**
	 *  模仿爬虫,取出图片 
	 * @throws IOException 
	 */
	@Test
	public void test4() throws IOException{
		URL url=new URL("https://www.baidu.com/");
		StringBuilder sb=new StringBuilder();
BufferedReader reader=new BufferedReader(new InputStreamReader(url.openStream()));
        String temp="";
        while( (temp = reader.readLine())!=null){
        	// System.out.println(temp);
        	sb.append(temp);
        }
   //   System.out.println(sb.toString());
     
  // 	Pattern p= Pattern.compile("<a.+</a>");
       
     //  Pattern p= Pattern.compile("<a[\\s\\S]+?</a>");
        //  <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a>
        //   <a[\\s\\S]+  匹配出现 0 次或者 1 次 ,避免 超链接 连续
        
        
       Pattern p= Pattern.compile("<a[\\s\\S]+?</a>");
     
   	Matcher m= p.matcher(sb.toString());
	while(m.find()){  
		System.out.println("超链接是:"+m.group());
	
		
	}	
		
	}

	//  从 a  标签中取出 链接地址 正则表达式
	@Test
	public void test5(){
		Pattern p2= Pattern.compile("href=[\\s\\S]+(.com)");
		Matcher m2= p2.matcher("<a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a>");
		if(m2.find()){
			System.out.println(m2.group());
		}
		
	}

 参考博客:https://www.cnblogs.com/dreamingbaobei/p/9717234.html

猜你喜欢

转载自blog.csdn.net/dreams_deng/article/details/105622721