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

    对于web来说,字符串的处理特别重要,而正则表达式是对字符串处理的利器,在字符过滤,验证方面都能看到她的身影。

    今天需要处理一段json字符串,在用String.replaceAll的过程中,遇到了正则表达式不会写的尴尬场景。所以还是简单地补补正则表达式的知识吧。

    先从一个正则表达式的使用讲起。

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Test {
        public static void main(String[] args) {
            
            //这个正则表达式表示匹配1254-8888888,125-6966356这样子的字符
            String regex = "\d{3,4}-\d{7}";
            
            //初始字符串
            String str = "agdf/1254-8888888sssdf125-6966356";
            String aft = str.replaceAll(regex, "替换");
            System.out.println("repalceAll后==="+aft);
            
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(str);
            //m.find()为true则一直匹配下去
            while(m.find()){
                //因为正则表达式中没有()括号,所以捕获组数为0
                System.out.println("捕获组数,m.groupCount==="+m.groupCount());
                
                //m.group()相当于m.group(0),对应着groupCount,即直接匹配,不分组
                System.out.println("m.group==="+m.group(0));
                
            }
            
        }
    
    }

    运行结果

    repalceAll后===agdf/替换sssdf替换
    m.group===1254-8888888
    捕获组数,m.groupCount===0
    m.group===125-6966356
    捕获组数,m.groupCount===0

    从那个正则表达式说起, String regex = "\d{3,4}-\d{7}";

    "\d"这个是java的转义,本来的正则应该是“d”,表示的是匹配0到9的数字,应该也可以写成这样[0-9],没试过。

    "\d{3,4}"表示d的个数有3到4个,即匹配123,3212,000这些数字,后面的“\d{7}”同理,匹配8888888等字符。

    至于分组这些,看下下面这个demo

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Test {
        public static void main(String[] args) {
            
            //这个正则表达式表示匹配1254-8888888,125-6966356这样子的字符
            String regex = "([a-zA-Z]+)(\d{7})";
            
            //初始字符串
            String str = "AGdf12548888888sssdf1256966356";
            
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(str);
            //m.find()为true则一直匹配下去
            while(m.find()){
                //因为正则表达式中没有()括号,所以捕获组数为0
                System.out.println("捕获组数,m.groupCount==="+m.groupCount());
                
                //m.group()相当于m.group(0),对应着groupCount,即直接匹配,不分组
                System.out.println("m.group(0)==="+m.group(0));
                //对应第一个括号([a-zA-Z]+)
                System.out.println("m.group(1)==="+m.group(1));
                //对应第二个括号(\d{7})
                System.out.println("m.group(2)==="+m.group(2));
                
                System.out.println("=============我是换行符============");
                
            }
            
        }
    
    }

    运行结果

    捕获组数,m.groupCount===2
    m.group(0)===AGdf1254888
    m.group(1)===AGdf
    m.group(2)===1254888
    =============我是换行符============
    捕获组数,m.groupCount===2
    m.group(0)===sssdf1256966
    m.group(1)===sssdf
    m.group(2)===1256966
    =============我是换行符============

    最后再附带下常用的正则表达式字符

    字符的取值范围
    1.[abc] : 表示可能是a,可能是b,也可能是c。
    2.[^abc]: 表示不是a,b,c中的任意一个
    3.[a-zA-Z]: 表示是英文字母
    4.[0-9]:表示是数字

    简洁的字符表示
    .:匹配任意的字符
    d:表示数字
    D:表示非数字
    s:表示由空字符组成,[ xf]
    S:表示由非空字符组成,[^s]
    w:表示字母、数字、下划线,[a-zA-Z0-9_]
    W:表示不是由字母、数字、下划线组成

    数量表达式
    1.?: 表示出现0次或1次
    2.+: 表示出现1次或多次
    3.*: 表示出现0次、1次或多次
    4.{n}:表示出现n次
    5.{n,m}:表示出现n~m次
    6.{n,}:表示出现n次或n次以上

    逻辑表达式
    1.XY: 表示X后面跟着Y,这里X和Y分别是正则表达式的一部分
    2.X|Y:表示X或Y,比如"food|f"匹配的是foo(d或f),而"(food)|f"匹配的是food或f
    3.(X):子表达式,将X看做是一个整体
  • 相关阅读:
    秋招结束了
    面向萌新的日麻面麻规则简化/改进
    DataTable 转换为Tree 树状结构
    jmeter beanshell断言
    jmeter请求参数包含中文
    Centos7 yum缓存rpm安装包
    nginx针对某个url限制ip访问,常用于后台访问限制
    有关json-lib2.4在转java对象时超过7位数的Double类型会出现科学计数法和精度丢失的问题
    SAP 下载安装
    android okhttp + retrofit使用
  • 原文地址:https://www.cnblogs.com/sundaymorning/p/7494907.html
Copyright © 2011-2022 走看看