zoukankan      html  css  js  c++  java
  • Java正则表达式

            正则表达式,又称正规表示法常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。


    正则表达式功能强大,用于处理复杂的字符串操作。举例如下:

    public class  TestRegex
    {
    	public static void main(String[] args) 
    	{
    		checkQQ();
    		checkQQ_1();
    //		checkTel();	
    	}	
    	public static void checkQQ()
    	{
    		String qq = "123a454";
    
    		String regex = "[1-9]\d{4,14}";
    
    		boolean flag = qq.matches(regex);
    		if(flag)
    			System.out.println(qq+"...is ok");
    		else
    			System.out.println(qq+"... 不合法");
    
    	}
    
    
    	/*
    	对QQ号码进行校验
    	要求:5~15  0不能开头,只能是数字
    	
    	这种方式,使用了String类中的方法,进行组合完成了需求。但是代码过于复杂。
    
    	*/
    
    	public static void checkQQ_1()
    	{
    		String qq = "123a454";
    
    		int len = qq.length();
    
    		if(len>=5 && len<=10)
    		{
    			if(!qq.startsWith("0"))
    			{
    				
    				
    				char[] arr = qq.toCharArray();//123a4
    				boolean flag = true;
    				for(int x=0;x<arr.length; x++)
    				{
    					if(!(arr[x]>='0' && arr[x]<='9'))
    					{
    						flag = false;
    						break;
    					}
    				}
    				if(flag)
    				{
    					System.out.println("qq:"+qq);
    				}
    				else
    				{
    					System.out.println("出现非法字符");	
    				}
    				
    			}
    			else
    			{
    				System.out.println("不可以0开头");
    
    			}
    		}
    		else
    		{
    			System.out.println("长度错误");
    		}
    	}
    }
    
    由示例可以看出,使用正则表达式确实相当方便。可以大大缩短校验字符串的繁琐程度。只需要定义一个正则表达式就可以实现。


    正则表达式:符合一定规则的表达式。
    作用:用于专门操作字符串。
    特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
    所以学习正则表达式,就是在学习一些特殊符号的使用。

    好处:可以简化对字符串的复杂操作。
    弊端:符号定义越多,正则越长,阅读性越差。

    具体操作功能:

    1,匹配:String  matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
    2,切割:String split();
    3,替换:String replaceAll(regex,str);如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。

    示例如下:

    public class  RegexDemo
    {
    	public static void main(String[] args) 
    	{
    		demo();
    
    		checkTel();
    
    		splitDemo("zhangsan.lisi.wangwu","\.");
    		splitDemo("c:\abc\a.txt","\\");
    
    		splitDemo("erkktyqqquizzzzzo","(.)\1+");
    //按照叠词完成切割。为了可以让规则的结果被重用
    //可以将规则封装成一个组。用()完成。组的出现都有编号。
    //从1开始。 想要使用已有的组可以通过  
    (n就是组的编号)的形式来获取。
    
    		String str = "wer1389ty1234564uiod234345675f";//将字符串中的数组替换成#。
    		
    		replaceAllDemo(str,"\d{4,}","#");
    
    		String str1 = "erkktyqqqquizzzzzo";  //将重叠的字符替换成单个字母。zzzz->z
    		replaceAllDemo(str1,"(.)\1+","$1");
    
    		
    	}
    
    	public static void replaceAllDemo(String str,String reg,String newStr)
    	{
    		str = str.replaceAll(reg,newStr);
    
    		System.out.println(str);
    	}
    
    
    
    	public static void splitDemo(String str,String reg)
    	{
    		
    		//String reg = " +";//按照多个空格来进行切割
    		String[] arr = str.split(reg);  
    		System.out.println(arr.length);
    		for(String s : arr)
    		{
    			System.out.println(s);
    		}
    	}
    
    	/*
    	匹配
    	手机号段只有 13xxx 15xxx 18xxxx
    
    	*/
    	public static void checkTel()
    	{
    		String tel = "16900001111";
    		String telReg = "1[358]\d{9}";
    		System.out.println(tel.matches(telReg));
    	}
    
    	
    	public static void demo()
    	{
    		String str = "b2323456789";
    
    		String reg = "[a-zA-Z]\d+";
    
    		boolean b= str.matches(reg);
    		System.out.println(b);
    	}
    	
    }




    以下是正则表达式的构造摘要:


    构造 匹配
     
    字符
    x 字符 x
    \ 反斜线字符
    n 带有八进制值 0 的字符 n (0 <= n <= 7)
    nn 带有八进制值 0 的字符 nn (0 <= n <= 7)
    mnn 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)
    xhh 带有十六进制值 0x 的字符 hh
    uhhhh 带有十六进制值 0x 的字符 hhhh
    制表符 ('u0009')
    新行(换行)符 ('u000A')
    回车符 ('u000D')
    f 换页符 ('u000C')
    a 报警 (bell) 符 ('u0007')
    e 转义符 ('u001B')
    cx 对应于 x 的控制符
     
    字符类
    [abc] abc(简单类)
    [^abc] 任何字符,除了 abc(否定)
    [a-zA-Z] azAZ,两头的字母包括在内(范围)
    [a-d[m-p]] admp[a-dm-p](并集)
    [a-z&&[def]] def(交集)
    [a-z&&[^bc]] az,除了 bc[ad-z](减去)
    [a-z&&[^m-p]] az,而非 mp[a-lq-z](减去)
     
    预定义字符类
    . 任何字符(与行结束符可能匹配也可能不匹配)
    d 数字:[0-9]
    D 非数字: [^0-9]
    s 空白字符:[ x0Bf ]
    S 非空白字符:[^s]
    w 单词字符:[a-zA-Z_0-9]
    W 非单词字符:[^w]
     
    POSIX 字符类(仅 US-ASCII)
    p{Lower} 小写字母字符:[a-z]
    p{Upper} 大写字母字符:[A-Z]
    p{ASCII} 所有 ASCII:[x00-x7F]
    p{Alpha} 字母字符:[p{Lower}p{Upper}]
    p{Digit} 十进制数字:[0-9]
    p{Alnum} 字母数字字符:[p{Alpha}p{Digit}]
    p{Punct} 标点符号:!"#$%&'()*+,-./:;<=>?@[]^_`{|}~


    正则表达式的第四个功能:

    4、获取:将字符串中的符合规则的子串取出。


    操作步骤:

    1、将正则表达式封装成对象。

    2、让正则对象和要操作的字符串相关联。

    3、关联后,获取正则匹配引擎。

    4、通过引擎对符合规则的子串进行操作,比如取出。


    举例如下:

    import java.util.regex.*;
    
    public class RegexDemo2 
    {
    	public static void main(String[] args) 
    	{
    		getDemo();
    	}
    	public static void getDemo()
    	{
    		String str = "ming tian jiu yao fang jia le ,da jia。";
    		System.out.println(str);
    		String reg = "\b[a-z]{4}\b";
    
    		//将规则封装成对象。
    		Pattern p = Pattern.compile(reg);
    
    		//让正则对象和要作用的字符串相关联。获取匹配器对象。
    		Matcher m  = p.matcher(str);
    
    	//System.out.println(m.matches());//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。
    	//只不过被String的方法封装后,用起来较为简单。但是功能却单一。
    //		boolean b = m.find();//将规则作用到字符串上,并进行符合规则的子串查找。
    //		System.out.println(b);
    //		System.out.println(m.group());//用于获取匹配后结果。
    		
    		
    		//System.out.println("matches:"+m.matches());
    		while(m.find())
    		{
    			System.out.println(m.group());
    			System.out.println(m.start()+"...."+m.end());
    		}
    	}
    }


    Regex正则表达式的四个功能,该如何选择用哪个?


    思路方式:


    1,如果只想知道该字符是对是错,使用匹配
    2,想要将已有的字符串变成另一个字符串,替换
    3,想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。
    4,想要拿到符合需求的字符串子串,获取。获取符合规则的子串。








  • 相关阅读:
    OSX安装nginx和rtmp模块(rtmp直播服务器搭建)
    用runtime来重写Coder和deCode方法 归档解档的时候使用
    Homebrew安装卸载
    Cannot create a new pixel buffer adaptor with an asset writer input that has already started writing'
    OSX下面用ffmpeg抓取桌面以及摄像头推流进行直播
    让nginx支持HLS
    iOS 字典转json字符串
    iOS 七牛多张图片上传
    iOS9UICollectionView自定义布局modifying attributes returned by UICollectionViewFlowLayout without copying them
    Xcode6 iOS7模拟器和Xcode7 iOS8模拟器离线下载
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6467324.html
Copyright © 2011-2022 走看看