前言:因为业务需要需要匹配出文档中特定的数据,并且赋值到到特定的数组上面,
所以需要用到特定的关系进行匹配,正则表达式是一个不错的选择,但是毕竟
是普通人所以没办法!习惯性遗忘...说句实话还是用的少的原因,下面简单的
复习下为了以后自己看,简单的做下笔记,虽然今天的事蛮多的,还有一道算法
没有写完,我会努力的
正则表达式
基本概念:正则表达式本质上是一个字符串,用于格式的验证,匹配,查找,替换等,为了与
普通的字符串进行区分,该字符串通常使用"^"开头,使用"&"结尾,可以省略。
常用的规则:
-[abc] - 表示可以出现a,b以及c.
-[^abc] - 表示可以出现任何字符除a,b,c.
-[a-zA-Z]- 表示可以出现任何字母,也就是a到z和A到Z之间的任意字符.
-\d -表示可以出现任何数字,相当于[0-9].
-\D -表示可以出现任何非数字,相当于[^0-9].
-\s -表示可以出现任何空白字符,相当于[\t\n\xob\f\r].
-\S -表示可以出现任何非空白字符,相当于[^\s].
-\w -表示可以出现单词字母,相当于[a-zA-Z_0-9],就是字母数字下划线.
-\W -表示可以出现任何非单词字符,相当于[^\w].
-X? -表示X可以出现一次或者一次也没有,也就是可以出现0~1次.
-X* -表示X可以出现零次或多次,也就是可以去出现0~n次.
-X+ -表示X可以出现一次或者多次,也就是可以出现1~n次.
-X{n} -表示X恰好出现n次.
-X{n,} -表示X可以出现至少n次,也就是 >=n次
-X{n,m} -表示X可以出现至少n次,但是不超过m次,也就是 >=n次并且<=m次
提示:有的时候String类中的split()方法可以进行字符串拆分.
下面写几个实例:
1) 描述银行卡密码的规则:要求必须是数字,而且必须是6位
String reg = "^\d{6}&";
但是很遗憾这样子写是错误的,因为在Java中存在一个转义问题正确的写法如下:
String reg = "^\\d{6}&";
2) 描述用户名的规则,要求由6 ~ 8位数字字母以及下划线组成
String reg = "^\\w{6,8}&";
3) 描述座机号码的规则,要求3~4位区号由数字组成、-、7~8位数字组成的号码
String reg = "^\\d{3,4}[-]{1}\\d{7,8}&";
4) 描述手机号码的规则,要求11位数字组成,第一位必须是1
String reg = "^[1]{1}\\d{10}";
5) 描述身份证号的规则,要求总共18位,前面17位必须是数字,后面1位可以是数字也可以X
String reg = "^\\d{17}\\[0-9x]{1}&";
6) 描述邮箱的规则,要求邮箱名必须由数字字母下划线组成,至少一位,@,
分析:常见的邮箱后缀为@qq.com,@126.com,@org.com反正我就见到过这三种
String reg = "^\\w+[@]{1}[0-9a-zA-Z]{2,4}(.com.cn.com.cn|.org)$";
提示:如果需要过滤或者替换...上面说过了.忘了的自己去翻,号我自己翻回去看看一般用到了String里
面的方法.
以下方法全部参考自JDK api 1.6(1.8还没有追,更别说1.9了...)
a.如果判断是否符合特定的格式
String str = "12345678@qq.com"; //需要验证的字符串
String reg = "^\\w+[@]{1}[0-9a-zA-Z]{2,4}(.com|.cn|.com.cn|.org)$";//验证的格式
boolean boo = str.matches(reg);
调用此方法的 str.matches(regex) 形式与以下表达式产生的结果完全相同:
Pattern.matches(regex, str)
参数:
regex - 用来匹配此字符串的正则表达式
返回:
当且仅当此字符串匹配给定的正则表达式时,返回 true
附加匹配信息:
我们在工作中难免会碰到汉字的可能性,查了下资料发现匹配的公式是这个样子的:
[\u4E00-\u9FA5] 需要注意的一点是前后并不能加 '^','&'或者是两个全家,至于原因以后我会补上
下面补充一个例子:
7)
String str = "规划路线的坐标 x541y440";
String reg = "[\u4E00-\u9FA5]+\\s+\\w+";
if(str.matches(reg)){
System.out.println("匹配成功!");
}else{
System.out.println("匹配失败!");
}
经过验证是没有问题的.
我复习正则表达式的目的
以下是部分验证代码:
String str1 = "12-01 21:"; //暂时先来验证这一段字符串
String str2 = "12-01";
String str3 = "12-01 21:34:36.401";
String str4 = "12-01 21:34:36.401 719-719/";
String str5 = "12-01 21:34:36.401 719-719/com.hiteam.ghyj I/System.out:";
String str6 = "12-01 21:34:36.401 719-719/com.hiteam.ghyj I/System.out: 规划路线的坐标 x577y96";
/** 根据我的分析是这个样子的**/
String regex = "^\\d+[-]+\\d+\\s+\\d+[:]+";
String regex3 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+";
String regex4 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+";
String regex5 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+\\w+[.]+\\w+[.]+\\w+\\s+\\w+[/]+\\w+[.]+\\w+[:]+";
String regex6 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+\\w+[.]+\\w+[.]+\\w+\\s+\\w+[/]+\\w+[.]+\\w+[:]+\\s+[\u4E00-\u9FA5]+\\s+\\w+";
if(str6.matches(regex6)){
System.out.println(1);
}else{
System.out.println(0);
}
下面根据String提供的方法split进行分割
public String[] split(String regex)根据给定正则表达式的匹配拆分此字符串。
该方法的作用就像是使用给定的表达式和限制参数 0 来调用两参数 split 方法。因此,所得数组中不包括结尾空字符串。
例如,字符串 "boo:and:foo" 使用这些表达式可生成以下结果:
Regex 结果
: { "boo", "and", "foo" }
o { "b", "", ":and:f" }
参数:
regex - 定界正则表达式
也就是把跟表达式相同的部分全部过滤掉了,且返回的类型是一个String[]很有意思
下面是拆分之后的代码
// 先来验证一部分字符串
String str1 = "12-01 21:"; //暂时先来验证这一段字符串
String str2 = "12-01";
String str3 = "12-01 21:34:36.401";
String str4 = "12-01 21:34:36.401 719-719/";
String str5 = "12-01 21:34:36.401 719-719/com.hiteam.ghyj I/System.out:";
String str6 = "12-01 21:34:36.401 719-719/com.hiteam.ghyj I/System.out: 规划路线的坐标 x577y96";
/** 根据我的分析是这个样子的**/
String regex = "^\\d+[-]+\\d+\\s+\\d+[:]+";
String regex3 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+";
String regex4 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+";
String regex5 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+
\\w+[.]+\\w+[.]+\\w+\\s+\\w+[/]+\\w+[.]+\\w+[:]+";
String regex6 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+
\\w+[.]+\\w+[.]+\\w+\\s+\\w+[/]+\\w+[.]+\\w+[:]+\\s+[\u4E00-\u9FA5]+\\s+\\w+";
/** 根据需求知道我需要截取的是后面的x和y那么如下:**/
String regex7 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+
\\w+[.]+\\w+[.]+\\w+\\s+\\w+[/]+\\w+[.]+\\w+[:]+\\s+[\u4E00-\u9FA5]+\\s+";
if(str6.matches(regex6)){
System.out.println(1);
}else{
System.out.println(0);
}
String[] strValue = str6.split(regex7);
for(int i = 0; i < strValue.length; i++){
if(!"".equals(strValue[i])){
System.out.println(strValue[i]);
}
}
输出结果为:
1
x577y96
是没有问题的,感觉收获蛮大的.争取一周更新两篇博客.
人生为棋,我愿为卒,行动虽慢,可谁见我都会后退一步...