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

正则中添加 (?<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的正则表达式讲解:(为了能看清,本文正则表达式用中文的句号代替英文句点) 英文句点符号:匹配单个任意字符。...
    红姑娘阅读 4,419评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,168评论 19 139
  • 1匹配验证-验证Email是否正确 2在字符串中查询字符或者字符串 3常用正则表达式 规则 正则表达式语法一个或...
    大赟哥阅读 479评论 0 0
  • 每個人都應該成就更好的自己。今天看電視的時候有注意到這麼一段話,感觸很深。是啊!人一生的樂趣是什麼?生活,怎...
    美梅阅读 196评论 0 0
  • 遇到小确幸,心情很好;回味一下,心情也能变好。 1.一路遇到好几个绿灯; 2.一路遇到好几个红灯,但到了单位发现恰...
    野人献曝阅读 370评论 0 0