正则表达式


正则表达式

一.正则表达式是指符合一定规则的表达式,它是用来专门操作字符串。如匹配字符串、查找字符串、替换字符串等。可以说,正则表达式是一段文本或一个公式,它是用来描述用某种模式去匹配一类字符串的公式,是字符串功能组合起来操作复杂数据的代表不多的优化。

特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
因此学习正则表达式,就是在学习一些特殊符号的使用。

如对QQ号码的检验

要求:5~15  0不能开头,只能是数字,长度为5到15的范围内。
这种方式,使用了String类中的方法,进行组合完成了需求。但是代码过于复杂。

public static void checkQQ()
	{
		String qq = "1882345a0";

		int len = qq.length();

		if(len>=5 && len<=15)
		{
			if(!qq.startsWith("0"))  //判断是否为0开头
			{
				
			char[] arr = qq.toCharArray();//将字符串转为数组,判断每个字符是否为数字
				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("长度错误");
		}
	}
}

但是用了正则表达式,根本就不用这么多代码。

public static void checkQQ()
	{
		String qq = "123a454";

		String regex = "[1-9]\\d{4,14}";  //第一个数字为1~9,//d 表示数字,{4,14}表示//d即数字至少出现4次,最多14次。

		boolean flag = qq.matches(regex);
		if(flag)
			System.out.println(qq+"...is ok");
		else
			System.out.println(qq+"... 不合法");

	}


二.正则表达式的具体操作功能:

    1,匹配:String  matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。则表达式实现方法:

     String str="a";

     String reg="[abcd]';

     boolean b=str.matches(reg);  //match判断是否符合正则表达式

常用构造方摘要:

字符类 (只出现一次)
[abc]abc(简单类) 
[^abc]任何字符,除了 abc(否定)
[a-zA-Z]az AZ,两头的字母包括在内(范围)
[a-d[m-p]]ad mp[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空白字符:[ \t\n\x0B\f\r]
\S非空白字符:[^\s]
\w单词字符:[a-zA-Z_0-9]
\W非单词字符:[^\w]
注意:因为在java一个反斜杆会变为转义字符,因此如\d 是一个整体,需要把\转义为普通的反斜杆,再和d组合,正确写法是\\d


Greedy 数量词(即出现次数)
X?X,一次或一次也没有
X*X,零次或多次
X+X,一次或多次
X{n}X,恰好 n
X{n,}X,至少 n
X{n,m}X,至少 n 次,但是不超过m

练习

   匹配
手机号段只有 13xxx 15xxx 18xxxx

public static void checkTel()
	{
		String tel = "16900001111";
		String telReg = "1[358]\\d{9}";
		System.out.println(tel.matches(telReg));
	}

     2.切割功能  String split();

               public String[] split(String regx,int limit)
               根据匹配给定的正则表达式来拆分此字符串。 
class  RegexDemo
{
	public static void main(String[] args) 
	{
            splitDemo("num1,num2,num3",",")     //此处按照,号进行切割,依次打印num1  num2  num3
          }
public static void splitDemo(String str,String reg)
	{
		
	
		String[] arr = str.split(reg);  
		System.out.println(arr.length);
		for(String s : arr)
		{
			System.out.println(s);
		}
	}
}


   特殊情况:
  •  对空格的切割要注意,可能会字符串之间有多个空格的情况,有两个以上空格 用" +"。 
  • splitDemo("num1     num2 num3"," +")  //按照多个空格来切割
  •   如果正则表达式用"."来切割的话,会什么都没有。为什么呢?因为"."代表任意字符,导致所有字符都被切割了。
    注意:.是任意字符--->\.在代表正则表达式里面普通的.--->放在字符串里面,应该再转义一下,所以为"\\."才正确。
splitDemo("num1.num2.num3","\\.")   //按照.来切割
  •     切割绝对路径的像 ("d:\\abc\\a.txt") 用"\\\\" 转义一下
  • splitDemo("d:\\abc\\a.txt","\\\\")

  • 按照叠词完成切割。
    2.1.splitDemo("abccdkkboodd","cc");  只切割cc的叠词
    2.2.splitDemo("abccdkkboodd","(.)\\1");   可以切割cc,kk,oo 的叠词 ,可以将规则封装成一个组。用()完成。组的出现都有编号。即是第一位的                                                             内容在第二位也出现了//从1开始。 想要使用已有的组可以通过  \n(n就是组的编号)的形式来获取。
    2.3.splitDemo("abccccccccdkkbooooooodd","(.)\\1+"); 切割2个以上的叠词。

3.替换功能  String replaceAll(regex,str);  把符合正则表达式的字符替换成自定义的字符

class  RegexDemo
{
	public static void main(String[] args) 
	{
            replaceAllDemo("num1,num2,num3",",",".....")  //此处按照,号进行替换成..... 依次打印num1.....num2.....num3
          }
         public static void replaceAllDemo(String str,String reg,String newStr){
            str = str.replaceAll(reg,newStr);
           System.out.println(str);
         }
}


       特殊情况:

String str1 = "abccccccccdkkbooooooodd"; //将重叠的字符替换成单个字母。cccccccc->c

replaceAllDemo(str1,"(.)\\1+","$1"); //另外一个符号获取组里面的符号 $1  前一个规则的第一个组,如果没有写的话整个一个组,0组.

4.获取功能  按照规则把指定的子字符串取出来

 4.1  Java正则表达式基础知识:由上可看出

  •  将正则表达式封装为对象Pattern,需要引用java.util.regex包。
    Pattern 常用方法:
          |-- static Pattern         compile(String regex)    将给定的正则表达式编译到模式中。 
              int         flags()  返回此模式的匹配标志。 
              Matcher           matcher(CharSequence input)   创建匹配给定输入与此模式的匹配器。 
  • String 里面的match()方法用的是Pattern 和 Matcher 来完成的,只不过用来封装是简单些。
        Matcher m  = p.matcher(str);      
      System.out.println(m.matches()); 
  •  匹配器   Matcher  ,需要引用java.util.regex包。
     Matcher 常用方法:
       |--int end() 
              返回最后匹配字符之后的偏移量。
     int end(int group) 
              返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。  
     boolean find() 
              尝试查找与该模式匹配的输入序列的下一个子序列。
    String group() 
              返回由以前匹配操作所匹配的输入子序列。
     int start() 
              返回以前匹配的初始索引。  
  • 匹配时,只有去找到,才能去取。 find()--> group()
    注意:如果先使用了matches() 方法,再使用find()方法,后者会调用前者索引后的指针位置开始找,因为这两个方法所用的指针是一样的。
import java.util.regex.*;
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("matches:"+m.matches()); //这里使用指针会改变。
		while(m.find())   //将规则作用到字符串上,并进行符合规则的子串查找。

		{
			System.out.println(m.group());
			System.out.println(m.start()+"...."+m.end());
		}
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值