Java正则表达式

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

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的参数列表

正则中添加 (?)

/**
 *
 * @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._]+)*\\??(?([\\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正则表达式)