Java正则表达式

导读:本篇文章讲解 Java正则表达式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

认识正则表达式

​ 现在假设有一个字符串需要你判断字符串是否由数字组成,如果由数字组成则将变为数字进行乘法运算。

//判断字符串是否全部由文字组成
public static boolean isNumber(String str){
        char[] chars = str.toCharArray();
        for (char charEach : chars) {
            if(charEach>'9'||charEach<'0'){
                return false;
            }
        }
        return true;
    }

public static void main(String[] args){
    String str="124";
    if(isNumber(str)){
        int num=Integer.parseInt(str);
        System.out.println(2*str);
    }
}

​ 实际上这种验证得功能是非常简单的,但是如此简单的程序却需要开发者编写大量程序逻辑代码,那么如果是更加复杂的验证呢?那么在这样的情况下,对于验证来讲最好的做法就是利用正则表达式来完成。

public static void main (Stirng []args){
    String str="124";
    if(str.matches("\\d+")){
        
    }
}

​ 正则表达式最早是从 Perl 语言里面发展而来的,而后在 JDK1.4 以前如果需要使用到正则表达式的相关定义则需要单独引入其他的 jar 文件,但是从 JDK1.4 之后,正则已经默认被 JDK 所支持,并且提供有 java.util.regex 开发包,同时针对于 String 类也提出进行了一些修改,使其可以有方法之间支持正则处理。

​ 使用正则最大特点在于方便进行验证处理,以及方便进行复杂字符串的修改处理。

常用正则标记

​ 如果要想进行正则的处理操作,那么就首先需要对常用的正则标记有所掌握,从JDK1.4 开始提供有 java.util regex 开发包,里边定义这个包里面提供有一-个Pattern 程序类,在这个程序类里面定义有所有支持的正则标记。

  1. 【数量:单个】字符匹配

    • 任意字符: 表示由任意字符组成
    • \: 匹配””
    • \n: 匹配换行
    • \t: 匹配制表符
  2. 【数量:单个】字符集(可以从里面任意选择一个字符)

    • [abc]: 表示可能是字母a b c 中的任意一个

  3. 【数量:单个】简化字符集

    • . : 表示任意一个字符
    • \d : 等价于”0-9“范围
    • \D: 等价于”[ ^0 -9]” 范围
    • \s: 匹配任意一位空格 可能是空格、换行、制表符
    • \S: 匹配任意的非空字符
    • \w: 匹配字母 数字 下划线 等价于“[a-zA-Z_0-9]
    • \W: 匹配非字母 数字 下划线
  4. 边界匹配

    • ^: 匹配边界开始
    • $: 匹配边界结束
  5. 数量表示。默认情况下只有添加了数量单位才可以匹配多位字符

    • 表达式?: 该正则可以出现0次或者多次
    • 表达式+: 该正则可以出现一次或多次
    • 表达式*: 该正则可以出现0次 一次或多次
    • 表达式{n}: 表达式的长度正好为次
    • 表达式{n}: 表达式的长度为n次以上
    • 表达式{n-m}: 表达式的长度在n-m次
  6. 逻辑表达式: 可以连接多个正则:

    • 表达式X 表达式Y: X表达式之后紧跟Y表达式
    • 表达式X|Y: 有一个表达式满足即可
    • (表达式): 为表达式设置一个整体描述 可以为整体描述设置数量单元

String 类对正则得支持

​ 在进行正则表达式大部分处理的情况下都会基于Spring类来完成,并且在spring类里提供有如下与正则有关的操作。

  1. 将指定字符串进行正则判断

    public boolean matches(String regex)
    
  2. 替换全部

    public String replaceAll(String regex,String replacement)
    
  3. 替换首个

    public  String replaceFirst(String regex,String replacement)
    
  4. 正则拆分

    public String[] split(String regex)
    
  5. 正则拆分 拆分成指定的个数

    poublic String[] split(String regex,int limit)
    

示例 实现字符串替换(删除非字母和数字)

 String str="jjagj&*%$hj#^";
 String regex="[^a-zA-Z0-9]+";
 System.out.println(str.replaceAll(regex," "));

示例 是啊字符串的拆分

 String str="a1b22c333";
        String regex="\\d+";//正则表达式     要注意使用\\d+和\\d的区别
        String result[]=str.split(regex);
        for(int x=0;x<result.length;x++){
            System.out.print(result[x]+"、");
        }

​ 在正则处理的时候替换和拆分的操作相对简单一点,比较麻烦的是数据验证部分。

示例 判断一个数据是否是小数 如果是小数则则将其转换为double

 String str="111.11";
 String regex="\\d+(\\.\\d+)?";//小数点和小数位同时出现
 System.out.println(str.matches(regex));

示例 判断一个字符串是否由日期所组成,如果由日期所组成将其转换为data类型

  String str="2019-10-11";
  String regex="\\d{4}-\\d{2}-\\d{2}";
  if(str.matches(regex)){
      System.out.println(new SimpleDateFormat("yyyy-MM-dd").parse(str));
   }

​ 许哟啊注意的是正则无法对里面的内容进行判断,只能够对格式进行判断

示例 判断给定的电话号码是否正确

电话号码: 51283346 \\d{7,8}

电话号码: 01051283346 (\\d{3,4})?

电话号码: (010)-51283346。\(\\d{3,4}\)

 String str="(010)51283346";
 String regex="((\\d{3,4})|(\\(\\d{3,4}\\)))?\\d{7,8}";
 System.out.println(str.matches(regex));

示例 验证email地址格式

email的用户名可以由字母、数字、下划线所组成(不应该以_开头)

email 的域名可以由字母、数字、_、-所组成

域名的后缀必须是.cn 、.com 、 .net、.com.cn、.gov所组成

   String str="12345@qq.com";
   String regex="[a-zA-Z0-9]\\w+@\\w+\\.(cn|com|com.cn|gov)";
   System.out.println(str.matches(regex));

java.util.regex包支持

​ 虽然在大部分的情况下都可以以利用 String 类实现正则的操作,但是也有一 些情况下需要使用到 java.util.regex 开发包中提供的正则处理类。

​ 在这个包里面一共定义有两个类: Pattern (正则表达式编译)、Matcher (匹配)。

  1. Parttern 类提供由正则表达式的编译类支持:public static Pattren complie(String regex)

    同时也提供由字符串的拆分操作: public String [] split(CharSequence input)

    String str="haghhag*hahg&^%hhhkk";
            String regex="[^a-zA-Z]+";
            Pattern pat=Pattern.compile(str);//编译正则表达式
            String[] split = pat.split(regex);
    
  2. Matcher类实现正则匹配的处理类,这个类对象的实例化依赖Pattern来完成.

    Partten类中提供的方法 public Matcher matcher(CharSequence input)

    当获取到Matcher类的对香港之后就可以利用该类中的方法进行如下操作

    //正则匹配
    public boolean matchers()
    //字符串替换
    public String repalceAll(String replacement)
    

示例 字符串匹配

String str="101";
String regex="\\d+";
Pattern pat=Pattern.compile(regex);//编译正则表达式
Matcher matcher = pat.matcher(str);
System.out.println(matcher.matches());

​ 如果纯粹是以拆分、替换、匹配三种操作为例根本用不到java.util.regex开发包,只依赖String类就可以实现了,但是matcher类中提供由一种分组的功能,而这种分组的功能是String不具备的。

//        要求取出#{}标记中的所有内容
       String str="INSERT INTO dept(deptno,dname,loc) values(#{deptno},#{dname},#{loc}})";
       String regex="#\\{\\w+\\}";
       Pattern pat = Pattern.compile(regex);
        Matcher matcher = pat.matcher(str);
        while(matcher.find()){//是否由匹配成功的内容
            //分组
//            #{deptno}#{dname}#{loc}
            System.out.print(matcher.group());
//            deptnodnameloc
            Syst

​ java.util.regex开发包如果不是进行一些更为复杂的正则处理是很难用到的,而String 类所提供的功能只适合于简单的正则操作。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/107584.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!