定义:正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
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:// 请求头可能存在,也可能不存在,后面的路径和请求参数都是可能不存在的
-
请求头表示演变
源:https://
-> https?:// 可能不是https请求头
-> (https?://)? 可能整组 https:// 都不存在,存在只存在一次
-
路径演变
源:/BJChaney/BJChaney.github.io
-> /[\w._]+ 都是/XXX的结构 并且/之后至少有1个字符,路径中还可能包含 . _等符号
-> (/[\w._]+)* 路径整体是可以不存在或者存在多次的
-
参数列表演变
源:?1=1&2=2
-> \?? 参数列表如果存在,前边必须有一个?,因为?是特殊符号,所以要转义一下写成\?
-> [\w_]+=[\w._]+&? 参数格式为xxx=xxx,等号两边必须有一个字符,多个参数间可能存在&符号
-> ([\w_]+=[\w._]+&?)* 可能存在许多参数
->组合 \??([\w_]+=[\w._]+&?)*
-
最终组合成完整正则:(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);
}
}
}
}
网友评论