概述: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式。 Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。
一、正则表达式规则概述
首先记住几个常见的规则:
1、开始与结束 :^ 为开始表示, $ 为结束标志
举例: 以"a" 开始,"b"结束的字符串 "^[a](.)+[b]$"
System.out.println("acb11b".matches("^[a](.)+[b]$")); //true
2、限定词 : “*” 表示零次或者多次,等价于{0, }、 ”+ “至少一次 等价于{1,} 、“?” 表示0-1次 等价于{0,1}。 至于其他次数比如至少n次,不超过m次,那就是{n,m}表示
举例: 以数字开头,出现3次数字,后面是英文。
System.out.println("123acb11b".matches("[0-9]{3}(.)*"));//true
3、常见规则: [0-9] 数字,[a-zA-Z], 大小写字母 ,\\w 表示数字和英文大小写。
至于其他正则表达式规则, 参考java1.8JDK文档,Pattern类 http://tool.oschina.net/apidocs/apidoc?api=jdk-zh
二、String中的运用、matches()、split()、replace()
1、matches() 判断字符串是否符合规则
// ^1[3|4|5|8][0-9]\d{9}$ 手机正则
如果对正则规则还不太熟悉, 那么来解释一下(其实写法不是唯一的)
^1 : 以“1”开头
[3|4|5|8]:第二位必须是3458其中一个
\d{9}$ :9个任意数字结尾
static void testMed(String str) { String p = "^1[3|4|5|8][0-9]\d{9}$ "; System.out.println(str.matches(p)); }
2、replace() 字符替换
//去除空格 String str = "aa bbc a d".replaceAll(" +","");
以上内容是正则表达式的简单用法
三、正则表达式对象
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式。 Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。
//JDK提供的经典调用 Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches();
了解一下关于 ,捕获组的概念
捕获组可以通过从左到右计算其开括号来编号,编号是从1 开始的。例如,在表达式 ((A)(B(C)))中,存在四个这样的组:
1 ((A)(B(C))) 2 (A) 3 (B(C)) 4 (C)
组零始终代表整个表达式。 以 (?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。
与组关联的捕获输入始终是与组最近匹配的子序列。如果由于量化的缘故再次计算了组,则在第二次计算失败时将保留其以前捕获的值(如果有的话)例如,将字符串"aba" 与表达式(a(b)?)+ 相匹配,会将第二组设置为 "b"。在每个匹配的开头,所有捕获的输入都会被丢弃。
(1)、举例: 经典面试题,去除String中重复的字符
String str = "aaav.*sddff+ss"; String regex = "(.)\\1+"; //组的概念,(.)表示任意字符、\\1表示引用第一组(.) “+”至少出现一次 //正则表达式对象 Pattern p = Pattern.compile(regex); //匹配对象 Matcher matcher = p.matcher(str); String res = matcher.replaceAll("$1"); //$1:指的是第一组的一个元素 System.out.println(res);//av.*sdf+s
//str.replaceAll("(.)\\1+","$1"); //一样的意思: av.*sdf+s
(2)、 找出字符串中三个字母的字符串输出
/** find()判断是否存在规则下的字符串 group() 迭代取值 \\b 开始与结尾标志 */ private static void med() { String str = "aa abnb abjs anh asj h ashj"; String regex = "\\b[a-zA-Z]{3}\\b";//找出三个字符组成的串 Matcher m = Pattern.compile(regex).matcher(str); while(m.find()){ System.out.println(m.group()); //anh asj 不会取出abnb这种4个的、原因就是使用了\\b修饰
} }
三、常用的正则表达式
规则 | 正则表达式语法 |
一个或多个汉字 | ^[\u0391-\uFFE5]+$ |
邮政编码 | ^[1-9]\d{5}$ |
QQ号码 | ^[1-9]\d{4,10}$ |
邮箱 | ^[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\.){1,3}[a-zA-z\-]{1,}$ |
用户名(字母开头 + 数字/字母/下划线) | ^[A-Za-z][A-Za-z1-9_-]+$ |
手机号码 | ^1[3|4|5|8][0-9]\d{8}$ |
URL | ^((http|https)://)?([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ |
18位身份证号 | ^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3})(\d|X|x)?$ |