java正则表达式-- java.util.regex包下的Pattern类与Matcher

概述: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工做的类库包。它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式。 Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象作为匹配模式对字符串展开匹配检查。 首先一个Pattern实例订制了一个所用语法与PERL的相似的正则表达式经编译后的模式,而后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工做。java

1、正则表达式规则概述面试

首先记住几个常见的规则:正则表达式

一、开始与结束 :^ 为开始表示, $ 为结束标志api

举例: 以"a" 开始,"b"结束的字符串 "^[a](.)+[b]$"编码

System.out.println("acb11b".matches("^[a](.)+[b]$")); //true

二、限定词 : “*” 表示零次或者屡次,等价于{0, }、 ”+ “至少一次 等价于{1,} 、“?” 表示0-1次 等价于{0,1}。 至于其余次数好比至少n次,不超过m次,那就是{n,m}表示spa

举例: 以数字开头,出现3次数字,后面是英文。.net

System.out.println("123acb11b".matches("[0-9]{3}(.)*"));//true

三、常见规则: [0-9] 数字,[a-zA-Z], 大小写字母 ,\\w 表示数字和英文大小写。code

至于其余正则表达式规则, 参考java1.8JDK文档,Pattern类  http://tool.oschina.net/apidocs/apidoc?api=jdk-zh对象

 

2、String中的运用、matches()、split()、replace()blog

一、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)); }

 二、replace() 字符替换

//去除空格
String str = "aa bbc  a d".replaceAll(" +","");

以上内容是正则表达式的简单用法

 

3、正则表达式对象

   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修饰
} }

 

 3、经常使用的正则表达式

 

规则 正则表达式语法  
一个或多个汉字 ^[\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)?$
相关文章
相关标签/搜索