美文网首页
Java正则表达式

Java正则表达式

作者: BJChaney | 来源:发表于2016-09-09 17:59 被阅读271次

    定义:正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

    Example : 匹配 github.com 的url

    public String githubUrl = "https://github.com/BJChaney/BJChaney.github.io?1=1&2=2";
    
    public String githubRegex = "(https?://)?github.com(/[\\w._]+)*\\??([\\w_]+=[\\w._]+&?)*";
    

    基本概念

    1. 字符表示
    字符 含义
    . 任意字符
    [abc] a,b,c中其中一个
    [^abc] 非a,b,c的字符
    [a-z] 从a到z的任意字符
    [a-z&&[a-c]] a到c的任意字符(两集合交集)
    \s 空白字符(空格,回车(\r),换行(\n),tab(\t),换页(/f))
    \S 非空白字符
    \d 数字[0-9]
    \D 非数字
    \w 词字符[a-zA-Z0-9]
    \W 非词字符
    2. 频率表示符
    字符 含义
    * 0次或多次
    ? 1次或0次
    + 1次或多次
    X{n} 刚好n次
    X{n,} 最少n次
    X{n,m} 大于n次,小于m次
    3. 逻辑操作
    逻辑操作符 含义 例子
    XY Y在X后面 abc 逻辑顺序abc,匹配一个为abc的字符串
    X丨Y X或Y abc丨def 匹配一个abc或者一个def字符串
    (X) (abc) 可以匹配abc组,如(abc)+可以匹配abc,abcabc,abcabcabc...

    例子解析

    首先分析例子,因为是匹配github.com,所以github.com是必须存在的,http:// 请求头可能存在,也可能不存在,后面的路径和请求参数都是可能不存在的

    1. 请求头表示演变

      源:https://

      -> https?:// 可能不是https请求头

      -> (https?://)? 可能整组 https:// 都不存在,存在只存在一次

    2. 路径演变

      源:/BJChaney/BJChaney.github.io

      -> /[\w._]+ 都是/XXX的结构 并且/之后至少有1个字符,路径中还可能包含 . _等符号

      -> (/[\w._]+)* 路径整体是可以不存在或者存在多次的

    3. 参数列表演变

      源:?1=1&2=2

      -> \?? 参数列表如果存在,前边必须有一个?,因为?是特殊符号,所以要转义一下写成\?

      -> [\w_]+=[\w._]+&? 参数格式为xxx=xxx,等号两边必须有一个字符,多个参数间可能存在&符号

      -> ([\w_]+=[\w._]+&?)* 可能存在许多参数

      ->组合 \??([\w_]+=[\w._]+&?)*

    4. 最终组合成完整正则:(https?://)?github.com(/[\w.]+)*\??([\w]+=[\w._]+&?)*

    取值

    正则取值,主要是通过组()来取

    组:使用括号划分的正则表达式,默认根据组的编号来引用组,组0表示整个表达式,组1表示第一个被括号括起的组,依此类推

    Example : A(B(C))D
    其中,组0为ABCD,组1为BC,组2为C

    组默认是自增方式来编号的,可以利用自定义组名去取其中某段内容,格式:(?<组名>)

    Demo:取出并打印url的参数列表

    正则中添加 (?<params>)

    /**
     *
     * @author BJChaney
     */
    public class RegExpTest {
    
    public static void main(String[] args) {
    
        String githubUrl = "https://github.com/BJChaney/BJChaney.github.io?1=1&2=2";
    
        String githubRegex = "(https?://)?github.com(/[\\w._]+)*\\??(?<params>([\\w_]+=[\\w._]+&?)*)";
    
        System.out.println("match ? " + githubUrl.matches(githubRegex));
        Pattern pattern = Pattern.compile(githubRegex);
        Matcher matcher = pattern.matcher(githubUrl);
        if (matcher.find()) {
            String paramStr = matcher.group("params");
            System.out.println("params : " + paramStr);
            System.out.println("paramsCount : " + matcher.groupCount());
            for(int i = 0 ; i <= matcher.groupCount() ; i ++){
                System.out.println("group : " + i +"  content : " + matcher.group(i) );
            }
            pattern = Pattern.compile("&");
            String[] params = pattern.split(paramStr);
            for (String param : params) {
                String key = param.split("=")[0];
                String value = param.split("=")[1];
                System.out.println("key = " + key + " value = " + value);
            }
        }
    }
    }

    相关文章

      网友评论

          本文标题:Java正则表达式

          本文链接:https://www.haomeiwen.com/subject/bkaeettx.html