正则表达式:匹配 获取 切割 替换

本文介绍了正则表达式的特殊字符和表示范围的符号,如d、D、s、S、w、W等,并通过示例解释了作为单词边界的用法。还展示了如何在Java中使用正则表达式进行匹配和获取操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【特殊字符】
\d //数字0–9 (由一位数字组成的字符串)
\D //任意一个非数字字符
. //任意一个字符
\s //空白字符 空格 tab 回车 等
\S //非空白字符
\w //表示所有单词字符 包括0-9 26个英文字母和 _
\W //表示非单词字符
【表示范围的符号】

  • //几次都行
  • //至少一次
    ? //至多一次(0或1)

[] 开始和结束的位置
{} 出现的次数
() 表示子表达式开始和结束的位置

\d{6} 必须为6次数字
\d{6,10} 6至10位,包括10位数字
\d{6,} 至少10位

[0-9] 等同于\d

[0-9]{2} 数字出现2次

[a-z]{6} a-z出现6次
[a-zA-Z]{6} 6个字母忽略大小写
[abc] abc任选一个
1 以A或者B开头
[^AB] 表示AB不能为开头

[a-z&&[def]] 表示a-z和def的交集 即 def

“hi." 和 “high” 匹配
"ahi.
” 和 “ahigh” 匹配
"a.hi.*"和 “axhigh” 匹配

\b --------\W表示的字符可以做单词边界

但 “a.\bhi." 和 “axhigh” 不匹配
"a.\bhi.
” 和 “a high” 就匹配 为什么?

因为\b表示单词的边界 空格把 a 和high分成了两个单词
也就是说 high是另一个单词的开始 处在边界上
所以就匹配 而x不会把a和high分成两个单词

	/*
	     匹配:实际上使用的是String中的boolean matches(String regex)方法 ,判读一个字符串是否匹配某个正则表达式
         切割:实际上使用的是String中的String[] split(String regex) 

		 替换:实际上使用的是String中的String replaceAll(String regex, String replacement) 
		                              把字符串中符合正则表达式的都替换为第二个参数
         
		 获取:把正则表达式转换成Pattern类型的对象
		       使用Pattern对象的matcher方法得到Matcher对象
		       
	*/

=====================================================================================

import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Demo11
{
public static void main(String[] args)
{

	//piPei();

	//qieGe();

	//tiHuan();

	huoQu();
}

//【匹配】验证手机号
public static void piPei(){

    String phone="12838384444";
    String regex="1[38576]\\d{9}";

	boolean b = phone.matches(regex);
    sop(b);

}

public static void sop(Object obj){

    System.out.println(obj);
}

}

//【获取】

 import java.util.regex.Pattern;

import java.util.regex.Matcher;
public class Test{

public static void main(String[] args){
	
	String str="aaa   abcd       axss    xssdf";
	//1定义一个正则表达式;
	String regex="\\b[a-z]{4}\\b";
    //2使用Pattern把regex编译成一个正则(compile就是编译的意思)
	Pattern p=Pattern.compile(regex);
     //3使用Patter创建Matcher,建立字符串与正则之间的练习
	Matcher m=p.matcher(str);

	while(m.find()){                               //m.find   从str中是否找到符合regex的字串
		System.out.println(m.group());              //m.group() 获取到符合条件的字串
	}

	
}

}

//【替换】
public static void tiHuan(){

      //String str="zhangsanxxxxxxxxlisi**********zhaoliu$$$$$$$$$$$$$$wangwu";
      //String regex = "(.)\\1+";


	  //String str="lskdjflksd9283749837493lsjdflskjdf098409283409wehro564321980";
      //String regex = "\\d{8,}";

      String str="13533337777";
      String regex="(\\d{3})\\d{4}(\\d{4})";

      String ss = str.replaceAll(regex,"$1****$2");//$1表示取第一组的值   在正则表达式外用$1表示第一组
      sop(ss);
}


//【切割】
public static void qieGe()
{
    //String str="zhangsan.lisi.zhaoliu.wangwu";
	//String regex="\\.";//表示字符点

	//String str="zhangsan   lisi       zhaoliu  wangwu";
	//String regex=" +";

	String str="zhangsanxxxxxxxxlisi**********zhaoliu$$$$$$$$$$$$$$wangwu";
	String regex="(.)\\1+"; //第二位和第一组的值是一样的,一个正则表达式可以包括多组,从左到右依次是第一组,第二组
               //在正则表达式里面第一组就用\\1表示。
	String[] arr = str.split(regex);
    for(int i=0;i<arr.length;i++){
	   sop(arr[i]);
	}
}

========================================================================================================================================
import java.util.Arrays;
class Test2
{
public static void main(String[] args)
{
// 练习2:对ip地址按照数值顺序排序。192.168.1.200 10.10.10.10 4.4.4.4 127.0.0.1

	String str = "192.168.1.200  10.10.10.10  4.4.4.4 127.0.0.1";//"192.168.001.200  010.010.010.010  004.004.004.004 127.000.000.001";

	//统一补两个0
	String s1=str.replaceAll("(\\d{1,3})","00$1");
    System.out.println(s1);//1至3位数字,设置成一个组。 在这个组前面加上两个0. 

	//统一弄成3位的
    String s2=s1.replaceAll("0*(\\d{3})","$1");
	System.out.println(s2); //任意个0,后面的三个数设成一组。  只留下后面只有三个数的组。

	//切割出四个ip地址
	String[] ips =s2.split(" +");
                         //至少一个空格 进行切割
	//按字符串大小排序
    Arrays.sort(ips);
    
	for(int i=0;i<ips.length;i++){
	  System.out.println(ips[i].replaceAll("0*(\\d{1,3})","$1"));
	}                                      //任意个数的0,后面至少一个数,设置成一组。  只留下这个组。



	//练习1:我我..我我..我.我要...要要...要要...要学学....学学学...编编...编编..编程...程程...程程..程.程
   //要求,转成:我要学编程。
   /*
     String str = "我我..我我..我.我要...要要...要要...要学学....学学学...编编...编编..编程...程程...程程..程.程";

	 String ss = str.replaceAll("\\.+","");  //选中至少一个点,转变成无。
	                                //这里一定要使用双斜杠进行转义,因为.表示任意字符,直接使用.进行替换不会有任何的变化

	 String s2=ss.replaceAll("(.)\\1+","$1");//任意字符的一个组,//  任意字符的一个组1  \\1表示第二位置上 重复组1 至少一次。   全部换成组1

	 System.out.println(s2);*/


}

}

class Test3
{
public static void main(String[] args)
{

	   String email=0lisi_hehe@qq.com.cn;

       String regex=[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-z]+){1,2};
}

}


  1. AB ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值