正则表达式
本文章将浅显的介绍正则表达式的使用。
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
前言:本文将使用正则验证工具MTracer。
下图为工具界面
同时此工具可将正则直接转化为所需代码
使用前请将所示勾选
接下来将使用此工具解析正则。
1、\d 一个数组
2、\D 一个非数字
3、\w 一个字母0-9 a-z 不区分大小写
4、\W 一个非字母
5、. 任意一个字符
6、?
1.修饰符 修饰前一个正则出现的次数为0~1次
举例\d?
?的意思是前面的\d只能出现0~1次 如果如图两次就不匹配
2.模式选择(贪婪模式|非)
7、+ 修饰前一个正则出现的次数为1~N次(最少要出现一次)
8、* 修饰前一个正则出现的次数为0~N次
举例
一个非字母+任意
9、[ ] 字符选择器
[0-9] 表示在指定范围中任意取一个字符
[a-z] [A-Z]
[0-9a-zA-Z] 任意满足一个条件的一个字符
举例:验证10-20的数字
10、() 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。
寻找符合的字符串 (可用来验证网址或者邮箱)
分组
加了()后就相当于分割符
关于是老写法 如果是06 就不行
11、{ } 修饰一个数选择器 修饰前一个正则出现的范围
比如\W(非字母)出现的次数在1-3 出现4次就不匹配
这个是必须5次
12、\ 转义字符
将{转义 表示这个{ 匹配
13、 ^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 ^。
1. 取非
不允许前面是135
2. 从左到右匹配
14、$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 $。
拓展:一般来说验证中会用到 ^()$ 边界界定符 你的字符串与正则完整匹配
举例在idea中使用正则解析出需求的部分
1、例1 解析日期"1996-5-06"
public static void main(String[] args) {
String mydate = "1996-5-06";
String reg = "(\\d{4})-(\\d{1,2})-(\\d{1,2})";
Matcher m = Pattern.compile(reg).matcher(mydate);
m.find();
System.out.println(m.group(3));
}
使用正则中的()字符串选择器可准确解析出所需的年月日,group(0)/(1)/(2)/(3)分别可解析出完整日期/年/月/日。
2、在一下代码中要求解析出PageName后的网址信息:
{EventCategory=index_开年特价_C6s_8核16G_带宽, browserSize=1366x636, screenColors=24-bit, PageName=https://activity.huaweicloud.com/2020feb_.promotion/index.html, D17=1271, City=西安, type=2, ClientIP=1.80.147.220, Province=陕西, EventLabel=, 'C1=activity, EventAction=click_ _10M, ChannelFrom=Direct, UserAgent=Mozilla/5.0AITA 1./A1AIA1A/(Windows NT 6.1;WOW64)AppleWebKit/537.36.(KHTML,like Gecko) Chrome/69.0.3497.100 Safari/537.36, Value=1, plt=1082, Country=中国, VisitKey=b58221ab-86f8-41a2-8464-e12feba2ed46, screenResolution=1366x768, browserLang=zh-cn}
在不使用jackson的前提下如何比较简洁的提取出所需的网址呢
String word = "c9770c4dac06fe3b76ec9c7ad47273d0lindex_开年特价_C6s_8核16G_带宽_click_10M|host|202003201014321141{\"EventCategory\":\"index_开年特价_C6s_8核16G_带宽\",\"browserSize\":\"1366x636\",\"PageName\":\"https://activity.huaweicloud.com/2020feb_.promotion/index.html\",\"type\":\"2\",\"'C1\":\"activity\",\"ChannelFrom\":\"Direct\",\"UserAgent\":\"Mozilla/5.0AITA 1./A1AIA1A/(Windows NT 6.1;WOW64)AppleWebKit/537.36.(KHTML,like Gecko) Chrome/69.0.3497.100 Safari/537.36\",\"screenResolution\":\"1366x768\",\"screenColors\":\"24-bit\",\"D17\":\"1271\",\"City\":\"西安\",\"ClientIP\":\"1.80.147.220\",\"Province\":\"陕西\",\"EventLabel\":\"\",\"EventAction\":\"click_ _10M\",\"Value\":\"1\",\"plt\":\"1082\",\"Country\":\"中国\",\"VisitKey\":\"b58221ab-86f8-41a2-8464-e12feba2ed46\",\"browserLang\":\"zh-cn\"}|N33092|+0800|\n";
String reg = "(.*)(https.*html)(.*)";
Matcher m = Pattern.compile(reg).matcher(word);
m.find();
System.out.println(m.group(2));
在使用jackson时则比较方便
String word = "c9770c4dac06fe3b76ec9c7ad47273d0lindex_开年特价_C6s_8核16G_带宽_click_10M|host|202003201014321141{\"EventCategory\":\"index_开年特价_C6s_8核16G_带宽\",\"browserSize\":\"1366x636\",\"PageName\":\"https://activity.huaweicloud.com/2020feb_.promotion/index.html\",\"type\":\"2\",\"'C1\":\"activity\",\"ChannelFrom\":\"Direct\",\"UserAgent\":\"Mozilla/5.0AITA 1./A1AIA1A/(Windows NT 6.1;WOW64)AppleWebKit/537.36.(KHTML,like Gecko) Chrome/69.0.3497.100 Safari/537.36\",\"screenResolution\":\"1366x768\",\"screenColors\":\"24-bit\",\"D17\":\"1271\",\"City\":\"西安\",\"ClientIP\":\"1.80.147.220\",\"Province\":\"陕西\",\"EventLabel\":\"\",\"EventAction\":\"click_ _10M\",\"Value\":\"1\",\"plt\":\"1082\",\"Country\":\"中国\",\"VisitKey\":\"b58221ab-86f8-41a2-8464-e12feba2ed46\",\"browserLang\":\"zh-cn\"}|N33092|+0800|\n";
// 表达式对象
String regex2 = ".*(\\{.*PageName\":\"(.*)\".*}).*";
Pattern p = Pattern.compile(regex2);
ObjectMapper om = new ObjectMapper();
// 创建 Matcher 对象
Matcher m = p.compile(regex2,Pattern.CASE_INSENSITIVE |Pattern.CANON_EQ).matcher(word);
// 是否找到匹配
if( m.find())
{
String info = m.group(1);
HashMap map = om.readValue(info,HashMap.class);
System.out.println(map);
System.out.println(map.get("PageName"));
}